diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2016-10-31 11:09:00 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-02-17 05:55:19 +0000 |
commit | 8d71fae08078afbf4aa2de7429302f46d46fb43f (patch) | |
tree | dd67e91f7dc00c38582930a774981865c6d8d850 /examples/xml/saxbookmarks | |
parent | 146f6d261ba743b643825d62cdb2deb1e701d3d2 (diff) |
Polish the XML bookmarks examples
- Use Qt 5 connect syntax.
- Streamline code, remove unused members.
- Add a context menu for copying and opening the URLs.
- Add const to XML code.
- In the XML code, show the use of QStringLiteral in static inline
functions to create strings versus QLatin1String in comparison
overloads to avoid allocating strings from const char * literals.
Change-Id: Ib5e62ca188e271ffe01996dff3c9ea8e0b60739a
Reviewed-by: Topi Reiniƶ <topi.reinio@qt.io>
Diffstat (limited to 'examples/xml/saxbookmarks')
-rw-r--r-- | examples/xml/saxbookmarks/mainwindow.cpp | 67 | ||||
-rw-r--r-- | examples/xml/saxbookmarks/mainwindow.h | 13 | ||||
-rw-r--r-- | examples/xml/saxbookmarks/xbelgenerator.cpp | 18 | ||||
-rw-r--r-- | examples/xml/saxbookmarks/xbelgenerator.h | 6 | ||||
-rw-r--r-- | examples/xml/saxbookmarks/xbelhandler.cpp | 28 |
5 files changed, 68 insertions, 64 deletions
diff --git a/examples/xml/saxbookmarks/mainwindow.cpp b/examples/xml/saxbookmarks/mainwindow.cpp index 2ce2b9a508..0583cd82cf 100644 --- a/examples/xml/saxbookmarks/mainwindow.cpp +++ b/examples/xml/saxbookmarks/mainwindow.cpp @@ -62,17 +62,40 @@ MainWindow::MainWindow() treeWidget = new QTreeWidget; treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch); treeWidget->setHeaderLabels(labels); +#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) + treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); + connect(treeWidget, &QWidget::customContextMenuRequested, + this, &MainWindow::onCustomContextMenuRequested); +#endif setCentralWidget(treeWidget); - createActions(); createMenus(); statusBar()->showMessage(tr("Ready")); setWindowTitle(tr("SAX Bookmarks")); - resize(480, 320); + const QSize availableSize = QApplication::desktop()->availableGeometry(this).size(); + resize(availableSize.width() / 2, availableSize.height() / 3); } +#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) +void MainWindow::onCustomContextMenuRequested(const QPoint &pos) +{ + const QTreeWidgetItem *item = treeWidget->itemAt(pos); + if (!item) + return; + const QString url = item->text(1); + QMenu contextMenu; + QAction *copyAction = contextMenu.addAction(tr("Copy Link to Clipboard")); + QAction *openAction = contextMenu.addAction(tr("Open")); + QAction *action = contextMenu.exec(treeWidget->viewport()->mapToGlobal(pos)); + if (action == copyAction) + QGuiApplication::clipboard()->setText(url); + else if (action == openAction) + QDesktopServices::openUrl(QUrl(url)); +} +#endif // !QT_NO_CONTEXTMENU && !QT_NO_CLIPBOARD + void MainWindow::open() { QString fileName = @@ -93,8 +116,8 @@ void MainWindow::open() if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, tr("SAX Bookmarks"), tr("Cannot read file %1:\n%2.") - .arg(fileName) - .arg(file.errorString())); + .arg(QDir::toNativeSeparators(fileName), + file.errorString())); return; } @@ -116,8 +139,8 @@ void MainWindow::saveAs() if (!file.open(QFile::WriteOnly | QFile::Text)) { QMessageBox::warning(this, tr("SAX Bookmarks"), tr("Cannot write file %1:\n%2.") - .arg(fileName) - .arg(file.errorString())); + .arg(QDir::toNativeSeparators(fileName), + file.errorString())); return; } @@ -134,37 +157,21 @@ void MainWindow::about() "hand.")); } -void MainWindow::createActions() +void MainWindow::createMenus() { - openAct = new QAction(tr("&Open..."), this); + QMenu *fileMenu = menuBar()->addMenu(tr("&File")); + QAction *openAct = fileMenu->addAction(tr("&Open..."), this, &MainWindow::open); openAct->setShortcuts(QKeySequence::Open); - connect(openAct, SIGNAL(triggered()), this, SLOT(open())); - saveAsAct = new QAction(tr("&Save As..."), this); + QAction *saveAsAct = fileMenu->addAction(tr("&Save As..."), this, &MainWindow::saveAs); saveAsAct->setShortcuts(QKeySequence::SaveAs); - connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); - exitAct = new QAction(tr("E&xit"), this); + QAction *exitAct = fileMenu->addAction(tr("E&xit"), this, &QWidget::close); exitAct->setShortcuts(QKeySequence::Quit); - connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); - - aboutAct = new QAction(tr("&About"), this); - connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); - - aboutQtAct = new QAction(tr("About &Qt"), this); - connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); -} - -void MainWindow::createMenus() -{ - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(openAct); - fileMenu->addAction(saveAsAct); - fileMenu->addAction(exitAct); menuBar()->addSeparator(); - helpMenu = menuBar()->addMenu(tr("&Help")); - helpMenu->addAction(aboutAct); - helpMenu->addAction(aboutQtAct); + QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); + helpMenu->addAction(tr("&About"), this, &MainWindow::about); + helpMenu->addAction(tr("About &Qt"), qApp, &QCoreApplication::quit); } diff --git a/examples/xml/saxbookmarks/mainwindow.h b/examples/xml/saxbookmarks/mainwindow.h index 828a0ed14e..20a11bb202 100644 --- a/examples/xml/saxbookmarks/mainwindow.h +++ b/examples/xml/saxbookmarks/mainwindow.h @@ -68,20 +68,13 @@ public slots: void open(); void saveAs(); void about(); - +#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD) + void onCustomContextMenuRequested(const QPoint &pos); +#endif private: - void createActions(); void createMenus(); QTreeWidget *treeWidget; - - QMenu *fileMenu; - QMenu *helpMenu; - QAction *openAct; - QAction *saveAsAct; - QAction *exitAct; - QAction *aboutAct; - QAction *aboutQtAct; }; #endif diff --git a/examples/xml/saxbookmarks/xbelgenerator.cpp b/examples/xml/saxbookmarks/xbelgenerator.cpp index 30ce1428e6..ee6f113f9c 100644 --- a/examples/xml/saxbookmarks/xbelgenerator.cpp +++ b/examples/xml/saxbookmarks/xbelgenerator.cpp @@ -52,7 +52,7 @@ #include "xbelgenerator.h" -XbelGenerator::XbelGenerator(QTreeWidget *treeWidget) +XbelGenerator::XbelGenerator(const QTreeWidget *treeWidget) : treeWidget(treeWidget) { } @@ -81,25 +81,25 @@ QString XbelGenerator::indent(int depth) QString XbelGenerator::escapedText(const QString &str) { QString result = str; - result.replace("&", "&"); - result.replace("<", "<"); - result.replace(">", ">"); + result.replace('&', "&"); + result.replace('<', "<"); + result.replace('>', ">"); return result; } QString XbelGenerator::escapedAttribute(const QString &str) { QString result = escapedText(str); - result.replace("\"", """); + result.replace(QLatin1Char('"'), """); result.prepend(QLatin1Char('"')); result.append(QLatin1Char('"')); return result; } -void XbelGenerator::generateItem(QTreeWidgetItem *item, int depth) +void XbelGenerator::generateItem(const QTreeWidgetItem *item, int depth) { QString tagName = item->data(0, Qt::UserRole).toString(); - if (tagName == "folder") { + if (tagName == QLatin1String("folder")) { bool folded = !treeWidget->isItemExpanded(item); out << indent(depth) << "<folder folded=\"" << (folded ? "yes" : "no") << "\">\n" @@ -110,7 +110,7 @@ void XbelGenerator::generateItem(QTreeWidgetItem *item, int depth) generateItem(item->child(i), depth + 1); out << indent(depth) << "</folder>\n"; - } else if (tagName == "bookmark") { + } else if (tagName == QLatin1String("bookmark")) { out << indent(depth) << "<bookmark"; if (!item->text(1).isEmpty()) out << " href=" << escapedAttribute(item->text(1)); @@ -118,7 +118,7 @@ void XbelGenerator::generateItem(QTreeWidgetItem *item, int depth) << indent(depth + 1) << "<title>" << escapedText(item->text(0)) << "</title>\n" << indent(depth) << "</bookmark>\n"; - } else if (tagName == "separator") { + } else if (tagName == QLatin1String("separator")) { out << indent(depth) << "<separator/>\n"; } } diff --git a/examples/xml/saxbookmarks/xbelgenerator.h b/examples/xml/saxbookmarks/xbelgenerator.h index 44069599e2..abfabfd75c 100644 --- a/examples/xml/saxbookmarks/xbelgenerator.h +++ b/examples/xml/saxbookmarks/xbelgenerator.h @@ -61,7 +61,7 @@ QT_END_NAMESPACE class XbelGenerator { public: - XbelGenerator(QTreeWidget *treeWidget); + explicit XbelGenerator(const QTreeWidget *treeWidget); bool write(QIODevice *device); @@ -69,9 +69,9 @@ private: static QString indent(int indentLevel); static QString escapedText(const QString &str); static QString escapedAttribute(const QString &str); - void generateItem(QTreeWidgetItem *item, int depth); + void generateItem(const QTreeWidgetItem *item, int depth); - QTreeWidget *treeWidget; + const QTreeWidget *treeWidget; QTextStream out; }; diff --git a/examples/xml/saxbookmarks/xbelhandler.cpp b/examples/xml/saxbookmarks/xbelhandler.cpp index 03b16c81f1..7e2a9db3c2 100644 --- a/examples/xml/saxbookmarks/xbelhandler.cpp +++ b/examples/xml/saxbookmarks/xbelhandler.cpp @@ -52,6 +52,10 @@ #include "xbelhandler.h" +static inline QString versionAttribute() { return QStringLiteral("version"); } +static inline QString hrefAttribute() { return QStringLiteral("href"); } +static inline QString foldedAttribute() { return QStringLiteral("folded"); } + XbelHandler::XbelHandler(QTreeWidget *treeWidget) : treeWidget(treeWidget) { @@ -72,32 +76,32 @@ bool XbelHandler::startElement(const QString & /* namespaceURI */, const QString &qName, const QXmlAttributes &attributes) { - if (!metXbelTag && qName != "xbel") { + if (!metXbelTag && qName != QLatin1String("xbel")) { errorStr = QObject::tr("The file is not an XBEL file."); return false; } - if (qName == "xbel") { - QString version = attributes.value("version"); - if (!version.isEmpty() && version != "1.0") { + if (qName == QLatin1String("xbel")) { + QString version = attributes.value(versionAttribute()); + if (!version.isEmpty() && version != QLatin1String("1.0")) { errorStr = QObject::tr("The file is not an XBEL version 1.0 file."); return false; } metXbelTag = true; - } else if (qName == "folder") { + } else if (qName == QLatin1String("folder")) { item = createChildItem(qName); item->setFlags(item->flags() | Qt::ItemIsEditable); item->setIcon(0, folderIcon); item->setText(0, QObject::tr("Folder")); - bool folded = (attributes.value("folded") != "no"); + bool folded = (attributes.value(foldedAttribute()) != QLatin1String("no")); treeWidget->setItemExpanded(item, !folded); - } else if (qName == "bookmark") { + } else if (qName == QLatin1String("bookmark")) { item = createChildItem(qName); item->setFlags(item->flags() | Qt::ItemIsEditable); item->setIcon(0, bookmarkIcon); item->setText(0, QObject::tr("Unknown title")); - item->setText(1, attributes.value("href")); - } else if (qName == "separator") { + item->setText(1, attributes.value(hrefAttribute())); + } else if (qName == QLatin1String("separator")) { item = createChildItem(qName); item->setFlags(item->flags() & ~Qt::ItemIsSelectable); item->setText(0, QString(30, 0xB7)); @@ -111,11 +115,11 @@ bool XbelHandler::endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName) { - if (qName == "title") { + if (qName == QLatin1String("title")) { if (item) item->setText(0, currentText); - } else if (qName == "folder" || qName == "bookmark" - || qName == "separator") { + } else if (qName == QLatin1String("folder") || qName == QLatin1String("bookmark") + || qName == QLatin1String("separator")) { item = item->parent(); } return true; |