diff options
Diffstat (limited to 'examples/xml/streambookmarks')
-rw-r--r-- | examples/xml/streambookmarks/doc/src/qxmlstreambookmarks.qdoc | 2 | ||||
-rw-r--r-- | examples/xml/streambookmarks/mainwindow.cpp | 75 | ||||
-rw-r--r-- | examples/xml/streambookmarks/mainwindow.h | 13 | ||||
-rw-r--r-- | examples/xml/streambookmarks/xbelreader.cpp | 36 | ||||
-rw-r--r-- | examples/xml/streambookmarks/xbelreader.h | 4 | ||||
-rw-r--r-- | examples/xml/streambookmarks/xbelwriter.cpp | 29 | ||||
-rw-r--r-- | examples/xml/streambookmarks/xbelwriter.h | 6 |
7 files changed, 87 insertions, 78 deletions
diff --git a/examples/xml/streambookmarks/doc/src/qxmlstreambookmarks.qdoc b/examples/xml/streambookmarks/doc/src/qxmlstreambookmarks.qdoc index 0720e3eadd..ad093c2098 100644 --- a/examples/xml/streambookmarks/doc/src/qxmlstreambookmarks.qdoc +++ b/examples/xml/streambookmarks/doc/src/qxmlstreambookmarks.qdoc @@ -167,7 +167,7 @@ add them to the \c fileMenu and \c helpMenu. The connections are as shown below: - \snippet streambookmarks/mainwindow.cpp 4 + \snippet streambookmarks/mainwindow.cpp 5 The \c createMenus() function creates the \c fileMenu and \c helpMenu and adds the QAction objects to them in order to create the menu shown diff --git a/examples/xml/streambookmarks/mainwindow.cpp b/examples/xml/streambookmarks/mainwindow.cpp index 7c0fd8720d..c9a18fa3c4 100644 --- a/examples/xml/streambookmarks/mainwindow.cpp +++ b/examples/xml/streambookmarks/mainwindow.cpp @@ -63,18 +63,41 @@ 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("QXmlStream Bookmarks")); - resize(480, 320); + const QSize availableSize = QApplication::desktop()->availableGeometry(this).size(); + resize(availableSize.width() / 2, availableSize.height() / 3); } //! [0] +#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 + //! [1] void MainWindow::open() { @@ -92,8 +115,8 @@ void MainWindow::open() if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, tr("QXmlStream Bookmarks"), tr("Cannot read file %1:\n%2.") - .arg(fileName) - .arg(file.errorString())); + .arg(QDir::toNativeSeparators(fileName), + file.errorString())); return; } @@ -101,8 +124,8 @@ void MainWindow::open() if (!reader.read(&file)) { QMessageBox::warning(this, tr("QXmlStream Bookmarks"), tr("Parse error in file %1:\n\n%2") - .arg(fileName) - .arg(reader.errorString())); + .arg(QDir::toNativeSeparators(fileName), + reader.errorString())); } else { statusBar()->showMessage(tr("File loaded"), 2000); } @@ -124,8 +147,8 @@ void MainWindow::saveAs() if (!file.open(QFile::WriteOnly | QFile::Text)) { QMessageBox::warning(this, tr("QXmlStream Bookmarks"), tr("Cannot write file %1:\n%2.") - .arg(fileName) - .arg(file.errorString())); + .arg(QDir::toNativeSeparators(fileName), + file.errorString())); return; } @@ -144,41 +167,23 @@ void MainWindow::about() } //! [3] -//! [4] -void MainWindow::createActions() +//! [5] +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())); -} -//! [4] - -//! [5] -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); } //! [5] diff --git a/examples/xml/streambookmarks/mainwindow.h b/examples/xml/streambookmarks/mainwindow.h index 2b6feeb26f..fbdc1e0c62 100644 --- a/examples/xml/streambookmarks/mainwindow.h +++ b/examples/xml/streambookmarks/mainwindow.h @@ -69,20 +69,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; }; //! [0] diff --git a/examples/xml/streambookmarks/xbelreader.cpp b/examples/xml/streambookmarks/xbelreader.cpp index 53d6b94ba0..099985d91e 100644 --- a/examples/xml/streambookmarks/xbelreader.cpp +++ b/examples/xml/streambookmarks/xbelreader.cpp @@ -72,10 +72,12 @@ bool XbelReader::read(QIODevice *device) xml.setDevice(device); if (xml.readNextStartElement()) { - if (xml.name() == "xbel" && xml.attributes().value("version") == "1.0") + if (xml.name() == QLatin1String("xbel") + && xml.attributes().value(versionAttribute()) == QLatin1String("1.0")) { readXBEL(); - else + } else { xml.raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); + } } return !xml.error(); @@ -95,14 +97,14 @@ QString XbelReader::errorString() const //! [3] void XbelReader::readXBEL() { - Q_ASSERT(xml.isStartElement() && xml.name() == "xbel"); + Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("xbel")); while (xml.readNextStartElement()) { - if (xml.name() == "folder") + if (xml.name() == QLatin1String("folder")) readFolder(0); - else if (xml.name() == "bookmark") + else if (xml.name() == QLatin1String("bookmark")) readBookmark(0); - else if (xml.name() == "separator") + else if (xml.name() == QLatin1String("separator")) readSeparator(0); else xml.skipCurrentElement(); @@ -113,7 +115,7 @@ void XbelReader::readXBEL() //! [4] void XbelReader::readTitle(QTreeWidgetItem *item) { - Q_ASSERT(xml.isStartElement() && xml.name() == "title"); + Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("title")); QString title = xml.readElementText(); item->setText(0, title); @@ -123,7 +125,7 @@ void XbelReader::readTitle(QTreeWidgetItem *item) //! [5] void XbelReader::readSeparator(QTreeWidgetItem *item) { - Q_ASSERT(xml.isStartElement() && xml.name() == "separator"); + Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("separator")); QTreeWidgetItem *separator = createChildItem(item); separator->setFlags(item->flags() & ~Qt::ItemIsSelectable); @@ -134,20 +136,20 @@ void XbelReader::readSeparator(QTreeWidgetItem *item) void XbelReader::readFolder(QTreeWidgetItem *item) { - Q_ASSERT(xml.isStartElement() && xml.name() == "folder"); + Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("folder")); QTreeWidgetItem *folder = createChildItem(item); - bool folded = (xml.attributes().value("folded") != "no"); + bool folded = (xml.attributes().value(foldedAttribute()) != QLatin1String("no")); treeWidget->setItemExpanded(folder, !folded); while (xml.readNextStartElement()) { - if (xml.name() == "title") + if (xml.name() == QLatin1String("title")) readTitle(folder); - else if (xml.name() == "folder") + else if (xml.name() == QLatin1String("folder")) readFolder(folder); - else if (xml.name() == "bookmark") + else if (xml.name() == QLatin1String("bookmark")) readBookmark(folder); - else if (xml.name() == "separator") + else if (xml.name() == QLatin1String("separator")) readSeparator(folder); else xml.skipCurrentElement(); @@ -156,16 +158,16 @@ void XbelReader::readFolder(QTreeWidgetItem *item) void XbelReader::readBookmark(QTreeWidgetItem *item) { - Q_ASSERT(xml.isStartElement() && xml.name() == "bookmark"); + Q_ASSERT(xml.isStartElement() && xml.name() == QLatin1String("bookmark")); QTreeWidgetItem *bookmark = createChildItem(item); bookmark->setFlags(bookmark->flags() | Qt::ItemIsEditable); bookmark->setIcon(0, bookmarkIcon); bookmark->setText(0, QObject::tr("Unknown title")); - bookmark->setText(1, xml.attributes().value("href").toString()); + bookmark->setText(1, xml.attributes().value(hrefAttribute()).toString()); while (xml.readNextStartElement()) { - if (xml.name() == "title") + if (xml.name() == QLatin1String("title")) readTitle(bookmark); else xml.skipCurrentElement(); diff --git a/examples/xml/streambookmarks/xbelreader.h b/examples/xml/streambookmarks/xbelreader.h index 3175441ddd..fd486a430f 100644 --- a/examples/xml/streambookmarks/xbelreader.h +++ b/examples/xml/streambookmarks/xbelreader.h @@ -71,6 +71,10 @@ public: QString errorString() const; + static inline QString versionAttribute() { return QStringLiteral("version"); } + static inline QString hrefAttribute() { return QStringLiteral("href"); } + static inline QString foldedAttribute() { return QStringLiteral("folded"); } + private: //! [2] void readXBEL(); diff --git a/examples/xml/streambookmarks/xbelwriter.cpp b/examples/xml/streambookmarks/xbelwriter.cpp index fdf2e1095e..2959680678 100644 --- a/examples/xml/streambookmarks/xbelwriter.cpp +++ b/examples/xml/streambookmarks/xbelwriter.cpp @@ -51,9 +51,14 @@ #include <QtWidgets> #include "xbelwriter.h" +#include "xbelreader.h" + +static inline QString yesValue() { return QStringLiteral("yes"); } +static inline QString noValue() { return QStringLiteral("no"); } +static inline QString titleElement() { return QStringLiteral("title"); } //! [0] -XbelWriter::XbelWriter(QTreeWidget *treeWidget) +XbelWriter::XbelWriter(const QTreeWidget *treeWidget) : treeWidget(treeWidget) { xml.setAutoFormatting(true); @@ -66,9 +71,9 @@ bool XbelWriter::writeFile(QIODevice *device) xml.setDevice(device); xml.writeStartDocument(); - xml.writeDTD("<!DOCTYPE xbel>"); - xml.writeStartElement("xbel"); - xml.writeAttribute("version", "1.0"); + xml.writeDTD(QStringLiteral("<!DOCTYPE xbel>")); + xml.writeStartElement(QStringLiteral("xbel")); + xml.writeAttribute(XbelReader::versionAttribute(), QStringLiteral("1.0")); for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) writeItem(treeWidget->topLevelItem(i)); @@ -78,24 +83,24 @@ bool XbelWriter::writeFile(QIODevice *device) //! [1] //! [2] -void XbelWriter::writeItem(QTreeWidgetItem *item) +void XbelWriter::writeItem(const QTreeWidgetItem *item) { QString tagName = item->data(0, Qt::UserRole).toString(); - if (tagName == "folder") { + if (tagName == QLatin1String("folder")) { bool folded = !treeWidget->isItemExpanded(item); xml.writeStartElement(tagName); - xml.writeAttribute("folded", folded ? "yes" : "no"); - xml.writeTextElement("title", item->text(0)); + xml.writeAttribute(XbelReader::foldedAttribute(), folded ? yesValue() : noValue()); + xml.writeTextElement(titleElement(), item->text(0)); for (int i = 0; i < item->childCount(); ++i) writeItem(item->child(i)); xml.writeEndElement(); - } else if (tagName == "bookmark") { + } else if (tagName == QLatin1String("bookmark")) { xml.writeStartElement(tagName); if (!item->text(1).isEmpty()) - xml.writeAttribute("href", item->text(1)); - xml.writeTextElement("title", item->text(0)); + xml.writeAttribute(XbelReader::hrefAttribute(), item->text(1)); + xml.writeTextElement(titleElement(), item->text(0)); xml.writeEndElement(); - } else if (tagName == "separator") { + } else if (tagName == QLatin1String("separator")) { xml.writeEmptyElement(tagName); } } diff --git a/examples/xml/streambookmarks/xbelwriter.h b/examples/xml/streambookmarks/xbelwriter.h index b15bf60e31..465d8f0dc4 100644 --- a/examples/xml/streambookmarks/xbelwriter.h +++ b/examples/xml/streambookmarks/xbelwriter.h @@ -62,13 +62,13 @@ QT_END_NAMESPACE class XbelWriter { public: - XbelWriter(QTreeWidget *treeWidget); + explicit XbelWriter(const QTreeWidget *treeWidget); bool writeFile(QIODevice *device); private: - void writeItem(QTreeWidgetItem *item); + void writeItem(const QTreeWidgetItem *item); QXmlStreamWriter xml; - QTreeWidget *treeWidget; + const QTreeWidget *treeWidget; }; //! [0] |