From fe1ea010b946518803ca1cec1332945c26be83af Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 25 Aug 2015 14:19:37 +0200 Subject: Polish rich text example. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Introduce Qt 5 signals & slot syntax. - Use mime types in the file dialogs. - Streamline the code creating the actions. - Introduce QCommandLineParser. - Query the available size when determining the initial size instead of using hard-coded values for High-DPI screens. Change-Id: Ifc84a41ed55a4a674b6eafdb6120ac42441405b6 Reviewed-by: Topi Reiniƶ --- examples/widgets/richtext/textedit/main.cpp | 24 +- examples/widgets/richtext/textedit/textedit.cpp | 373 ++++++++++-------------- examples/widgets/richtext/textedit/textedit.h | 20 +- 3 files changed, 196 insertions(+), 221 deletions(-) (limited to 'examples/widgets/richtext') diff --git a/examples/widgets/richtext/textedit/main.cpp b/examples/widgets/richtext/textedit/main.cpp index 4dda7e6c75..1de6d994e6 100644 --- a/examples/widgets/richtext/textedit/main.cpp +++ b/examples/widgets/richtext/textedit/main.cpp @@ -32,15 +32,37 @@ ****************************************************************************/ #include "textedit.h" + #include +#include +#include +#include int main(int argc, char *argv[]) { Q_INIT_RESOURCE(textedit); QApplication a(argc, argv); + QCoreApplication::setOrganizationName("QtProject"); + QCoreApplication::setApplicationName("Rich Text"); + QCoreApplication::setApplicationVersion(QT_VERSION_STR); + QCommandLineParser parser; + parser.setApplicationDescription(QCoreApplication::applicationName()); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument("file", "The file to open."); + parser.process(a); + TextEdit mw; - mw.resize(700, 800); + + const QRect availableGeometry = QApplication::desktop()->availableGeometry(&mw); + mw.resize(availableGeometry.width() / 2, (availableGeometry.height() * 2) / 3); + mw.move((availableGeometry.width() - mw.width()) / 2, + (availableGeometry.height() - mw.height()) / 2); + + if (!mw.load(parser.positionalArguments().value(0, QLatin1String(":/example.html")))) + mw.fileNew(); + mw.show(); return a.exec(); } diff --git a/examples/widgets/richtext/textedit/textedit.cpp b/examples/widgets/richtext/textedit/textedit.cpp index 6af436ba46..201151c32e 100644 --- a/examples/widgets/richtext/textedit/textedit.cpp +++ b/examples/widgets/richtext/textedit/textedit.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,14 @@ TextEdit::TextEdit(QWidget *parent) #ifdef Q_OS_OSX setUnifiedTitleAndToolBarOnMac(true); #endif + setWindowTitle(QCoreApplication::applicationName()); + + textEdit = new QTextEdit(this); + connect(textEdit, &QTextEdit::currentCharFormatChanged, + this, &TextEdit::currentCharFormatChanged); + connect(textEdit, &QTextEdit::cursorPositionChanged, + this, &TextEdit::cursorPositionChanged); + setCentralWidget(textEdit); setToolButtonStyle(Qt::ToolButtonFollowStyle); setupFileActions(); @@ -80,22 +89,11 @@ TextEdit::TextEdit(QWidget *parent) setupTextActions(); { - QMenu *helpMenu = new QMenu(tr("Help"), this); - menuBar()->addMenu(helpMenu); - helpMenu->addAction(tr("About"), this, SLOT(about())); - helpMenu->addAction(tr("About &Qt"), qApp, SLOT(aboutQt())); + QMenu *helpMenu = menuBar()->addMenu(tr("Help")); + helpMenu->addAction(tr("About"), this, &TextEdit::about); + helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); } - textEdit = new QTextEdit(this); - connect(textEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), - this, SLOT(currentCharFormatChanged(QTextCharFormat))); - connect(textEdit, SIGNAL(cursorPositionChanged()), - this, SLOT(cursorPositionChanged())); - - setCentralWidget(textEdit); - textEdit->setFocus(); - setCurrentFileName(QString()); - QFont textFont("Helvetica"); textFont.setStyleHint(QFont::SansSerif); textEdit->setFont(textFont); @@ -103,44 +101,29 @@ TextEdit::TextEdit(QWidget *parent) colorChanged(textEdit->textColor()); alignmentChanged(textEdit->alignment()); - connect(textEdit->document(), SIGNAL(modificationChanged(bool)), - actionSave, SLOT(setEnabled(bool))); - connect(textEdit->document(), SIGNAL(modificationChanged(bool)), - this, SLOT(setWindowModified(bool))); - connect(textEdit->document(), SIGNAL(undoAvailable(bool)), - actionUndo, SLOT(setEnabled(bool))); - connect(textEdit->document(), SIGNAL(redoAvailable(bool)), - actionRedo, SLOT(setEnabled(bool))); + connect(textEdit->document(), &QTextDocument::modificationChanged, + actionSave, &QAction::setEnabled); + connect(textEdit->document(), &QTextDocument::modificationChanged, + this, &QWidget::setWindowModified); + connect(textEdit->document(), &QTextDocument::undoAvailable, + actionUndo, &QAction::setEnabled); + connect(textEdit->document(), &QTextDocument::redoAvailable, + actionRedo, &QAction::setEnabled); setWindowModified(textEdit->document()->isModified()); actionSave->setEnabled(textEdit->document()->isModified()); actionUndo->setEnabled(textEdit->document()->isUndoAvailable()); actionRedo->setEnabled(textEdit->document()->isRedoAvailable()); - connect(actionUndo, SIGNAL(triggered()), textEdit, SLOT(undo())); - connect(actionRedo, SIGNAL(triggered()), textEdit, SLOT(redo())); - actionCut->setEnabled(false); actionCopy->setEnabled(false); - connect(actionCut, SIGNAL(triggered()), textEdit, SLOT(cut())); - connect(actionCopy, SIGNAL(triggered()), textEdit, SLOT(copy())); - connect(actionPaste, SIGNAL(triggered()), textEdit, SLOT(paste())); - - connect(textEdit, SIGNAL(copyAvailable(bool)), actionCut, SLOT(setEnabled(bool))); - connect(textEdit, SIGNAL(copyAvailable(bool)), actionCopy, SLOT(setEnabled(bool))); - #ifndef QT_NO_CLIPBOARD - connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(clipboardDataChanged())); + connect(QApplication::clipboard(), &QClipboard::dataChanged, this, &TextEdit::clipboardDataChanged); #endif - QString initialFile = ":/example.html"; - const QStringList args = QCoreApplication::arguments(); - if (args.count() == 2) - initialFile = args.at(1); - - if (!load(initialFile)) - fileNew(); + textEdit->setFocus(); + setCurrentFileName(QString()); } void TextEdit::closeEvent(QCloseEvent *e) @@ -153,116 +136,89 @@ void TextEdit::closeEvent(QCloseEvent *e) void TextEdit::setupFileActions() { - QToolBar *tb = new QToolBar(this); - tb->setWindowTitle(tr("File Actions")); - addToolBar(tb); - - QMenu *menu = new QMenu(tr("&File"), this); - menuBar()->addMenu(menu); - - QAction *a; + QToolBar *tb = addToolBar(tr("File Actions")); + QMenu *menu = menuBar()->addMenu(tr("&File")); - QIcon newIcon = QIcon::fromTheme("document-new", QIcon(rsrcPath + "/filenew.png")); - a = new QAction( newIcon, tr("&New"), this); + const QIcon newIcon = QIcon::fromTheme("document-new", QIcon(rsrcPath + "/filenew.png")); + QAction *a = menu->addAction(newIcon, tr("&New"), this, &TextEdit::fileNew); + tb->addAction(a); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::New); - connect(a, SIGNAL(triggered()), this, SLOT(fileNew())); - tb->addAction(a); - menu->addAction(a); - a = new QAction(QIcon::fromTheme("document-open", QIcon(rsrcPath + "/fileopen.png")), - tr("&Open..."), this); + const QIcon openIcon = QIcon::fromTheme("document-open", QIcon(rsrcPath + "/fileopen.png")); + a = menu->addAction(openIcon, tr("&Open..."), this, &TextEdit::fileOpen); a->setShortcut(QKeySequence::Open); - connect(a, SIGNAL(triggered()), this, SLOT(fileOpen())); tb->addAction(a); - menu->addAction(a); menu->addSeparator(); - actionSave = a = new QAction(QIcon::fromTheme("document-save", QIcon(rsrcPath + "/filesave.png")), - tr("&Save"), this); - a->setShortcut(QKeySequence::Save); - connect(a, SIGNAL(triggered()), this, SLOT(fileSave())); - a->setEnabled(false); - tb->addAction(a); - menu->addAction(a); + const QIcon saveIcon = QIcon::fromTheme("document-save", QIcon(rsrcPath + "/filesave.png")); + actionSave = menu->addAction(saveIcon, tr("&Save"), this, &TextEdit::fileSave); + actionSave->setShortcut(QKeySequence::Save); + actionSave->setEnabled(false); + tb->addAction(actionSave); - a = new QAction(tr("Save &As..."), this); + a = menu->addAction(tr("Save &As..."), this, &TextEdit::fileSaveAs); a->setPriority(QAction::LowPriority); - connect(a, SIGNAL(triggered()), this, SLOT(fileSaveAs())); - menu->addAction(a); menu->addSeparator(); #ifndef QT_NO_PRINTER - a = new QAction(QIcon::fromTheme("document-print", QIcon(rsrcPath + "/fileprint.png")), - tr("&Print..."), this); + const QIcon printIcon = QIcon::fromTheme("document-print", QIcon(rsrcPath + "/fileprint.png")); + a = menu->addAction(printIcon, tr("&Print..."), this, &TextEdit::filePrint); a->setPriority(QAction::LowPriority); a->setShortcut(QKeySequence::Print); - connect(a, SIGNAL(triggered()), this, SLOT(filePrint())); tb->addAction(a); - menu->addAction(a); - a = new QAction(QIcon::fromTheme("fileprint", QIcon(rsrcPath + "/fileprint.png")), - tr("Print Preview..."), this); - connect(a, SIGNAL(triggered()), this, SLOT(filePrintPreview())); - menu->addAction(a); + const QIcon filePrintIcon = QIcon::fromTheme("fileprint", QIcon(rsrcPath + "/fileprint.png")); + menu->addAction(filePrintIcon, tr("Print Preview..."), this, &TextEdit::filePrintPreview); - a = new QAction(QIcon::fromTheme("exportpdf", QIcon(rsrcPath + "/exportpdf.png")), - tr("&Export PDF..."), this); + const QIcon exportPdfIcon = QIcon::fromTheme("exportpdf", QIcon(rsrcPath + "/exportpdf.png")); + a = menu->addAction(exportPdfIcon, tr("&Export PDF..."), this, &TextEdit::filePrintPdf); a->setPriority(QAction::LowPriority); a->setShortcut(Qt::CTRL + Qt::Key_D); - connect(a, SIGNAL(triggered()), this, SLOT(filePrintPdf())); tb->addAction(a); - menu->addAction(a); menu->addSeparator(); #endif - a = new QAction(tr("&Quit"), this); + a = menu->addAction(tr("&Quit"), this, &QWidget::close); a->setShortcut(Qt::CTRL + Qt::Key_Q); - connect(a, SIGNAL(triggered()), this, SLOT(close())); - menu->addAction(a); } void TextEdit::setupEditActions() { - QToolBar *tb = new QToolBar(this); - tb->setWindowTitle(tr("Edit Actions")); - addToolBar(tb); - QMenu *menu = new QMenu(tr("&Edit"), this); - menuBar()->addMenu(menu); + QToolBar *tb = addToolBar(tr("Edit Actions")); + QMenu *menu = menuBar()->addMenu(tr("&Edit")); - QAction *a; - a = actionUndo = new QAction(QIcon::fromTheme("edit-undo", QIcon(rsrcPath + "/editundo.png")), - tr("&Undo"), this); - a->setShortcut(QKeySequence::Undo); - tb->addAction(a); - menu->addAction(a); - a = actionRedo = new QAction(QIcon::fromTheme("edit-redo", QIcon(rsrcPath + "/editredo.png")), - tr("&Redo"), this); - a->setPriority(QAction::LowPriority); - a->setShortcut(QKeySequence::Redo); - tb->addAction(a); - menu->addAction(a); + const QIcon undoIcon = QIcon::fromTheme("edit-undo", QIcon(rsrcPath + "/editundo.png")); + actionUndo = menu->addAction(undoIcon, tr("&Undo"), textEdit, &QTextEdit::undo); + actionUndo->setShortcut(QKeySequence::Undo); + tb->addAction(actionUndo); + + const QIcon redoIcon = QIcon::fromTheme("edit-redo", QIcon(rsrcPath + "/editredo.png")); + actionRedo = menu->addAction(redoIcon, tr("&Redo"), textEdit, &QTextEdit::redo); + actionRedo->setPriority(QAction::LowPriority); + actionRedo->setShortcut(QKeySequence::Redo); + tb->addAction(actionRedo); menu->addSeparator(); - a = actionCut = new QAction(QIcon::fromTheme("edit-cut", QIcon(rsrcPath + "/editcut.png")), - tr("Cu&t"), this); - a->setPriority(QAction::LowPriority); - a->setShortcut(QKeySequence::Cut); - tb->addAction(a); - menu->addAction(a); - a = actionCopy = new QAction(QIcon::fromTheme("edit-copy", QIcon(rsrcPath + "/editcopy.png")), - tr("&Copy"), this); - a->setPriority(QAction::LowPriority); - a->setShortcut(QKeySequence::Copy); - tb->addAction(a); - menu->addAction(a); - a = actionPaste = new QAction(QIcon::fromTheme("edit-paste", QIcon(rsrcPath + "/editpaste.png")), - tr("&Paste"), this); - a->setPriority(QAction::LowPriority); - a->setShortcut(QKeySequence::Paste); - tb->addAction(a); - menu->addAction(a); + + const QIcon cutIcon = QIcon::fromTheme("edit-cut", QIcon(rsrcPath + "/editcut.png")); + actionCut = menu->addAction(cutIcon, tr("Cu&t"), textEdit, &QTextEdit::cut); + actionCut->setPriority(QAction::LowPriority); + actionCut->setShortcut(QKeySequence::Cut); + tb->addAction(actionCut); + + const QIcon copyIcon = QIcon::fromTheme("edit-copy", QIcon(rsrcPath + "/editcopy.png")); + actionCopy = menu->addAction(copyIcon, tr("&Copy"), textEdit, &QTextEdit::copy); + actionCopy->setPriority(QAction::LowPriority); + actionCopy->setShortcut(QKeySequence::Copy); + tb->addAction(actionCopy); + + const QIcon pasteIcon = QIcon::fromTheme("edit-paste", QIcon(rsrcPath + "/editpaste.png")); + actionPaste = menu->addAction(pasteIcon, tr("&Paste"), textEdit, &QTextEdit::paste); + actionPaste->setPriority(QAction::LowPriority); + actionPaste->setShortcut(QKeySequence::Paste); + tb->addAction(actionPaste); #ifndef QT_NO_CLIPBOARD if (const QMimeData *md = QApplication::clipboard()->mimeData()) actionPaste->setEnabled(md->hasText()); @@ -271,110 +227,89 @@ void TextEdit::setupEditActions() void TextEdit::setupTextActions() { - QToolBar *tb = new QToolBar(this); - tb->setWindowTitle(tr("Format Actions")); - addToolBar(tb); - - QMenu *menu = new QMenu(tr("F&ormat"), this); - menuBar()->addMenu(menu); + QToolBar *tb = addToolBar(tr("Format Actions")); + QMenu *menu = menuBar()->addMenu(tr("F&ormat")); - actionTextBold = new QAction(QIcon::fromTheme("format-text-bold", QIcon(rsrcPath + "/textbold.png")), - tr("&Bold"), this); + const QIcon boldIcon = QIcon::fromTheme("format-text-bold", QIcon(rsrcPath + "/textbold.png")); + actionTextBold = menu->addAction(boldIcon, tr("&Bold"), this, &TextEdit::textBold); actionTextBold->setShortcut(Qt::CTRL + Qt::Key_B); actionTextBold->setPriority(QAction::LowPriority); QFont bold; bold.setBold(true); actionTextBold->setFont(bold); - connect(actionTextBold, SIGNAL(triggered()), this, SLOT(textBold())); tb->addAction(actionTextBold); - menu->addAction(actionTextBold); actionTextBold->setCheckable(true); - actionTextItalic = new QAction(QIcon::fromTheme("format-text-italic", - QIcon(rsrcPath + "/textitalic.png")), - tr("&Italic"), this); + const QIcon italicIcon = QIcon::fromTheme("format-text-italic", QIcon(rsrcPath + "/textitalic.png")); + actionTextItalic = menu->addAction(italicIcon, tr("&Italic"), this, &TextEdit::textItalic); actionTextItalic->setPriority(QAction::LowPriority); actionTextItalic->setShortcut(Qt::CTRL + Qt::Key_I); QFont italic; italic.setItalic(true); actionTextItalic->setFont(italic); - connect(actionTextItalic, SIGNAL(triggered()), this, SLOT(textItalic())); tb->addAction(actionTextItalic); - menu->addAction(actionTextItalic); actionTextItalic->setCheckable(true); - actionTextUnderline = new QAction(QIcon::fromTheme("format-text-underline", - QIcon(rsrcPath + "/textunder.png")), - tr("&Underline"), this); + const QIcon underlineIcon = QIcon::fromTheme("format-text-underline", QIcon(rsrcPath + "/textunder.png")); + actionTextUnderline = menu->addAction(underlineIcon, tr("&Underline"), this, &TextEdit::textUnderline); actionTextUnderline->setShortcut(Qt::CTRL + Qt::Key_U); actionTextUnderline->setPriority(QAction::LowPriority); QFont underline; underline.setUnderline(true); actionTextUnderline->setFont(underline); - connect(actionTextUnderline, SIGNAL(triggered()), this, SLOT(textUnderline())); tb->addAction(actionTextUnderline); - menu->addAction(actionTextUnderline); actionTextUnderline->setCheckable(true); menu->addSeparator(); - QActionGroup *grp = new QActionGroup(this); - connect(grp, SIGNAL(triggered(QAction*)), this, SLOT(textAlign(QAction*))); - - // Make sure the alignLeft is always left of the alignRight - if (QApplication::isLeftToRight()) { - actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", - QIcon(rsrcPath + "/textleft.png")), - tr("&Left"), grp); - actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", - QIcon(rsrcPath + "/textcenter.png")), - tr("C&enter"), grp); - actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", - QIcon(rsrcPath + "/textright.png")), - tr("&Right"), grp); - } else { - actionAlignRight = new QAction(QIcon::fromTheme("format-justify-right", - QIcon(rsrcPath + "/textright.png")), - tr("&Right"), grp); - actionAlignCenter = new QAction(QIcon::fromTheme("format-justify-center", - QIcon(rsrcPath + "/textcenter.png")), - tr("C&enter"), grp); - actionAlignLeft = new QAction(QIcon::fromTheme("format-justify-left", - QIcon(rsrcPath + "/textleft.png")), - tr("&Left"), grp); - } - actionAlignJustify = new QAction(QIcon::fromTheme("format-justify-fill", - QIcon(rsrcPath + "/textjustify.png")), - tr("&Justify"), grp); - + const QIcon leftIcon = QIcon::fromTheme("format-justify-left", QIcon(rsrcPath + "/textleft.png")); + actionAlignLeft = new QAction(leftIcon, tr("&Left"), this); actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_L); actionAlignLeft->setCheckable(true); actionAlignLeft->setPriority(QAction::LowPriority); + const QIcon centerIcon = QIcon::fromTheme("format-justify-center", QIcon(rsrcPath + "/textcenter.png")); + actionAlignCenter = new QAction(centerIcon, tr("C&enter"), this); actionAlignCenter->setShortcut(Qt::CTRL + Qt::Key_E); actionAlignCenter->setCheckable(true); actionAlignCenter->setPriority(QAction::LowPriority); + const QIcon rightIcon = QIcon::fromTheme("format-justify-right", QIcon(rsrcPath + "/textright.png")); + actionAlignRight = new QAction(rightIcon, tr("&Right"), this); actionAlignRight->setShortcut(Qt::CTRL + Qt::Key_R); actionAlignRight->setCheckable(true); actionAlignRight->setPriority(QAction::LowPriority); + const QIcon fillIcon = QIcon::fromTheme("format-justify-fill", QIcon(rsrcPath + "/textjustify.png")); + actionAlignJustify = new QAction(fillIcon, tr("&Justify"), this); actionAlignJustify->setShortcut(Qt::CTRL + Qt::Key_J); actionAlignJustify->setCheckable(true); actionAlignJustify->setPriority(QAction::LowPriority); - tb->addActions(grp->actions()); - menu->addActions(grp->actions()); + // Make sure the alignLeft is always left of the alignRight + QActionGroup *alignGroup = new QActionGroup(this); + connect(alignGroup, &QActionGroup::triggered, this, &TextEdit::textAlign); + + if (QApplication::isLeftToRight()) { + alignGroup->addAction(actionAlignLeft); + alignGroup->addAction(actionAlignCenter); + alignGroup->addAction(actionAlignRight); + } else { + alignGroup->addAction(actionAlignRight); + alignGroup->addAction(actionAlignCenter); + alignGroup->addAction(actionAlignLeft); + } + alignGroup->addAction(actionAlignJustify); + + tb->addActions(alignGroup->actions()); + menu->addActions(alignGroup->actions()); menu->addSeparator(); QPixmap pix(16, 16); pix.fill(Qt::black); - actionTextColor = new QAction(pix, tr("&Color..."), this); - connect(actionTextColor, SIGNAL(triggered()), this, SLOT(textColor())); + actionTextColor = menu->addAction(pix, tr("&Color..."), this, &TextEdit::textColor); tb->addAction(actionTextColor); - menu->addAction(actionTextColor); - tb = new QToolBar(this); + tb = addToolBar(tr("Format Actions")); tb->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); - tb->setWindowTitle(tr("Format Actions")); addToolBarBreak(Qt::TopToolBarArea); addToolBar(tb); @@ -389,24 +324,26 @@ void TextEdit::setupTextActions() comboStyle->addItem("Ordered List (Alpha upper)"); comboStyle->addItem("Ordered List (Roman lower)"); comboStyle->addItem("Ordered List (Roman upper)"); - connect(comboStyle, SIGNAL(activated(int)), this, SLOT(textStyle(int))); + typedef void (QComboBox::*QComboIntSignal)(int); + connect(comboStyle, static_cast(&QComboBox::activated), this, &TextEdit::textStyle); + + typedef void (QComboBox::*QComboStringSignal)(const QString &); comboFont = new QFontComboBox(tb); tb->addWidget(comboFont); - connect(comboFont, SIGNAL(activated(QString)), this, SLOT(textFamily(QString))); + connect(comboFont, static_cast(&QComboBox::activated), this, &TextEdit::textFamily); comboSize = new QComboBox(tb); comboSize->setObjectName("comboSize"); tb->addWidget(comboSize); comboSize->setEditable(true); - QFontDatabase db; - foreach(int size, db.standardSizes()) + const QList standardSizes = QFontDatabase::standardSizes(); + foreach (int size, standardSizes) comboSize->addItem(QString::number(size)); + comboSize->setCurrentIndex(standardSizes.indexOf(QApplication::font().pointSize())); - connect(comboSize, SIGNAL(activated(QString)), this, SLOT(textSize(QString))); - comboSize->setCurrentIndex(comboSize->findText(QString::number(QApplication::font() - .pointSize()))); + connect(comboSize, static_cast(&QComboBox::activated), this, &TextEdit::textSize); } bool TextEdit::load(const QString &f) @@ -436,11 +373,11 @@ bool TextEdit::maybeSave() if (!textEdit->document()->isModified()) return true; - QMessageBox::StandardButton ret; - ret = QMessageBox::warning(this, tr("Application"), - tr("The document has been modified.\n" - "Do you want to save your changes?"), - QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); + const QMessageBox::StandardButton ret = + QMessageBox::warning(this, QCoreApplication::applicationName(), + tr("The document has been modified.\n" + "Do you want to save your changes?"), + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); if (ret == QMessageBox::Save) return fileSave(); else if (ret == QMessageBox::Cancel) @@ -459,7 +396,7 @@ void TextEdit::setCurrentFileName(const QString &fileName) else shownName = QFileInfo(fileName).fileName(); - setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Rich Text"))); + setWindowTitle(tr("%1[*] - %2").arg(shownName, QCoreApplication::applicationName())); setWindowModified(false); } @@ -473,10 +410,17 @@ void TextEdit::fileNew() void TextEdit::fileOpen() { - QString fn = QFileDialog::getOpenFileName(this, tr("Open File..."), - QString(), tr("HTML-Files (*.htm *.html);;All Files (*)")); - if (!fn.isEmpty()) - load(fn); + QFileDialog fileDialog(this, tr("Open File...")); + fileDialog.setAcceptMode(QFileDialog::AcceptOpen); + fileDialog.setFileMode(QFileDialog::ExistingFile); + fileDialog.setMimeTypeFilters(QStringList() << "text/html" << "text/plain"); + if (fileDialog.exec() != QDialog::Accepted) + return; + const QString fn = fileDialog.selectedFiles().first(); + if (load(fn)) + statusBar()->showMessage(tr("Opened \"%1\"").arg(QDir::toNativeSeparators(fn))); + else + statusBar()->showMessage(tr("Could not open \"%1\"").arg(QDir::toNativeSeparators(fn))); } bool TextEdit::fileSave() @@ -488,23 +432,27 @@ bool TextEdit::fileSave() QTextDocumentWriter writer(fileName); bool success = writer.write(textEdit->document()); - if (success) + if (success) { textEdit->document()->setModified(false); + statusBar()->showMessage(tr("Wrote \"%1\"").arg(QDir::toNativeSeparators(fileName))); + } else { + statusBar()->showMessage(tr("Could not write to file \"%1\"") + .arg(QDir::toNativeSeparators(fileName))); + } return success; } bool TextEdit::fileSaveAs() { - QString fn = QFileDialog::getSaveFileName(this, tr("Save as..."), QString(), - tr("ODF files (*.odt);;HTML-Files " - "(*.htm *.html);;All Files (*)")); - if (fn.isEmpty()) + QFileDialog fileDialog(this, tr("Save as...")); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + QStringList mimeTypes; + mimeTypes << "application/vnd.oasis.opendocument.text" << "text/html" << "text/plain"; + fileDialog.setMimeTypeFilters(mimeTypes); + fileDialog.setDefaultSuffix("odt"); + if (fileDialog.exec() != QDialog::Accepted) return false; - if (!(fn.endsWith(".odt", Qt::CaseInsensitive) - || fn.endsWith(".htm", Qt::CaseInsensitive) - || fn.endsWith(".html", Qt::CaseInsensitive))) { - fn += ".odt"; // default - } + const QString fn = fileDialog.selectedFiles().first(); setCurrentFileName(fn); return fileSave(); } @@ -528,7 +476,7 @@ void TextEdit::filePrintPreview() #if !defined(QT_NO_PRINTER) && !defined(QT_NO_PRINTDIALOG) QPrinter printer(QPrinter::HighResolution); QPrintPreviewDialog preview(&printer, this); - connect(&preview, SIGNAL(paintRequested(QPrinter*)), SLOT(printPreview(QPrinter*))); + connect(&preview, &QPrintPreviewDialog::paintRequested, this, &TextEdit::printPreview); preview.exec(); #endif } @@ -547,16 +495,19 @@ void TextEdit::filePrintPdf() { #ifndef QT_NO_PRINTER //! [0] - QString fileName = QFileDialog::getSaveFileName(this, "Export PDF", - QString(), "*.pdf"); - if (!fileName.isEmpty()) { - if (QFileInfo(fileName).suffix().isEmpty()) - fileName.append(".pdf"); - QPrinter printer(QPrinter::HighResolution); - printer.setOutputFormat(QPrinter::PdfFormat); - printer.setOutputFileName(fileName); - textEdit->document()->print(&printer); - } + QFileDialog fileDialog(this, tr("Export PDF")); + fileDialog.setAcceptMode(QFileDialog::AcceptSave); + fileDialog.setMimeTypeFilters(QStringList("application/pdf")); + fileDialog.setDefaultSuffix("pdf"); + if (fileDialog.exec() != QDialog::Accepted) + return; + QString fileName = fileDialog.selectedFiles().first(); + QPrinter printer(QPrinter::HighResolution); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setOutputFileName(fileName); + textEdit->document()->print(&printer); + statusBar()->showMessage(tr("Exported \"%1\"") + .arg(QDir::toNativeSeparators(fileName))); //! [0] #endif } diff --git a/examples/widgets/richtext/textedit/textedit.h b/examples/widgets/richtext/textedit/textedit.h index dade2b9edf..b338493d83 100644 --- a/examples/widgets/richtext/textedit/textedit.h +++ b/examples/widgets/richtext/textedit/textedit.h @@ -55,19 +55,15 @@ class TextEdit : public QMainWindow public: TextEdit(QWidget *parent = 0); + bool load(const QString &f); + +public slots: + void fileNew(); + protected: virtual void closeEvent(QCloseEvent *e) Q_DECL_OVERRIDE; -private: - void setupFileActions(); - void setupEditActions(); - void setupTextActions(); - bool load(const QString &f); - bool maybeSave(); - void setCurrentFileName(const QString &fileName); - private slots: - void fileNew(); void fileOpen(); bool fileSave(); bool fileSaveAs(); @@ -92,6 +88,12 @@ private slots: void printPreview(QPrinter *); private: + void setupFileActions(); + void setupEditActions(); + void setupTextActions(); + bool maybeSave(); + void setCurrentFileName(const QString &fileName); + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); void fontChanged(const QFont &f); void colorChanged(const QColor &c); -- cgit v1.2.3