QXmlStream Bookmarks Example▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include <QtWidgets>
#include
"mainwindow.h"
#include
"xbelreader.h"
#include
"xbelwriter.h"
MainWindow::
MainWindow()
{
QStringList labels;
labels &
lt;&
lt; tr("Title"
) &
lt;&
lt; tr("Location"
);
treeWidget =
new
QTreeWidget;
treeWidget-&
gt;header()-&
gt;setSectionResizeMode(QHeaderView::
Stretch);
treeWidget-&
gt;setHeaderLabels(labels);
#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD)
treeWidget-&
gt;setContextMenuPolicy(Qt::
CustomContextMenu);
connect(treeWidget, &
amp;QWidget::
customContextMenuRequested,
this
, &
amp;MainWindow::
onCustomContextMenuRequested);
#endif
setCentralWidget(treeWidget);
createMenus();
statusBar()-&
gt;showMessage(tr("Ready"
));
setWindowTitle(tr("QXmlStream Bookmarks"
));
const
QSize availableSize =
QApplication::
desktop()-&
gt;availableGeometry(this
).size();
resize(availableSize.width() /
2
, availableSize.height() /
3
);
}
#if !defined(QT_NO_CONTEXTMENU) && !defined(QT_NO_CLIPBOARD)
void
MainWindow::
onCustomContextMenuRequested(const
QPoint &
amp;pos)
{
const
QTreeWidgetItem *
item =
treeWidget-&
gt;itemAt(pos);
if
(!
item)
return
;
const
QString url =
item-&
gt;text(1
);
QMenu contextMenu;
QAction *
copyAction =
contextMenu.addAction(tr("Copy Link to Clipboard"
));
QAction *
openAction =
contextMenu.addAction(tr("Open"
));
QAction *
action =
contextMenu.exec(treeWidget-&
gt;viewport()-&
gt;mapToGlobal(pos));
if
(action ==
copyAction)
QGuiApplication::
clipboard()-&
gt;setText(url);
else
if
(action ==
openAction)
QDesktopServices::
openUrl(QUrl(url));
}
#endif
// !QT_NO_CONTEXTMENU && !QT_NO_CLIPBOARD
void
MainWindow::
open()
{
QString fileName =
QFileDialog::
getOpenFileName(this
, tr("Open Bookmark File"
),
QDir::
currentPath(),
tr("XBEL Files (*.xbel *.xml)"
));
if
(fileName.isEmpty())
return
;
treeWidget-&
gt;clear();
QFile file(fileName);
if
(!
file.open(QFile::
ReadOnly |
QFile::
Text)) {
QMessageBox::
warning(this
, tr("QXmlStream Bookmarks"
),
tr("Cannot read file %1:
\n
%2."
)
.arg(QDir::
toNativeSeparators(fileName),
file.errorString()));
return
;
}
XbelReader reader(treeWidget);
if
(!
reader.read(&
amp;file)) {
QMessageBox::
warning(this
, tr("QXmlStream Bookmarks"
),
tr("Parse error in file %1:
\n\n
%2"
)
.arg(QDir::
toNativeSeparators(fileName),
reader.errorString()));
}
else
{
statusBar()-&
gt;showMessage(tr("File loaded"
), 2000
);
}
}
void
MainWindow::
saveAs()
{
QString fileName =
QFileDialog::
getSaveFileName(this
, tr("Save Bookmark File"
),
QDir::
currentPath(),
tr("XBEL Files (*.xbel *.xml)"
));
if
(fileName.isEmpty())
return
;
QFile file(fileName);
if
(!
file.open(QFile::
WriteOnly |
QFile::
Text)) {
QMessageBox::
warning(this
, tr("QXmlStream Bookmarks"
),
tr("Cannot write file %1:
\n
%2."
)
.arg(QDir::
toNativeSeparators(fileName),
file.errorString()));
return
;
}
XbelWriter writer(treeWidget);
if
(writer.writeFile(&
amp;file))
statusBar()-&
gt;showMessage(tr("File saved"
), 2000
);
}
void
MainWindow::
about()
{
QMessageBox::
about(this
, tr("About QXmlStream Bookmarks"
),
tr("The <b>QXmlStream Bookmarks</b> example demonstrates how to use Qt's "
"QXmlStream classes to read and write XML documents."
));
}
void
MainWindow::
createMenus()
{
QMenu *
fileMenu =
menuBar()-&
gt;addMenu(tr("&File"
));
QAction *
openAct =
fileMenu-&
gt;addAction(tr("&Open..."
), this
, &
amp;MainWindow::
open);
openAct-&
gt;setShortcuts(QKeySequence::
Open);
QAction *
saveAsAct =
fileMenu-&
gt;addAction(tr("&Save As..."
), this
, &
amp;MainWindow::
saveAs);
saveAsAct-&
gt;setShortcuts(QKeySequence::
SaveAs);
QAction *
exitAct =
fileMenu-&
gt;addAction(tr("E&xit"
), this
, &
amp;QWidget::
close);
exitAct-&
gt;setShortcuts(QKeySequence::
Quit);
menuBar()-&
gt;addSeparator();
QMenu *
helpMenu =
menuBar()-&
gt;addMenu(tr("&Help"
));
helpMenu-&
gt;addAction(tr("&About"
), this
, &
amp;MainWindow::
about);
helpMenu-&
gt;addAction(tr("About &Qt"
), qApp, &
amp;QCoreApplication::
quit);
}