C++/Qt/QDockWidget

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Docking widget

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the examples of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QMainWindow>

QT_BEGIN_NAMESPACE class QAction; class QListWidget; class QMenu; class QTextEdit; QT_END_NAMESPACE

class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow();

private slots:

   void newLetter();
   void save();
   void print();
   void undo();
   void about();
   void insertCustomer(const QString &customer);
   void addParagraph(const QString &paragraph);

private:

   void createActions();
   void createMenus();
   void createToolBars();
   void createStatusBar();
   void createDockWindows();
   QTextEdit *textEdit;
   QListWidget *customerList;
   QListWidget *paragraphsList;
   QMenu *fileMenu;
   QMenu *editMenu;
   QMenu *viewMenu;
   QMenu *helpMenu;
   QToolBar *fileToolBar;
   QToolBar *editToolBar;
   QAction *newLetterAct;
   QAction *saveAct;
   QAction *printAct;
   QAction *undoAct;
   QAction *aboutAct;
   QAction *aboutQtAct;
   QAction *quitAct;

};

  1. endif


  1. include <QtGui>
  2. include "mainwindow.h"

MainWindow::MainWindow() {

   textEdit = new QTextEdit;
   setCentralWidget(textEdit);
   createActions();
   createMenus();
   createToolBars();
   createStatusBar();
   createDockWindows();
   setWindowTitle(tr("Dock Widgets"));
   newLetter();
   setUnifiedTitleAndToolBarOnMac(true);

}

void MainWindow::newLetter() {

   textEdit->clear();
   QTextCursor cursor(textEdit->textCursor());
   cursor.movePosition(QTextCursor::Start);
   QTextFrame *topFrame = cursor.currentFrame();
   QTextFrameFormat topFrameFormat = topFrame->frameFormat();
   topFrameFormat.setPadding(16);
   topFrame->setFrameFormat(topFrameFormat);
   QTextCharFormat textFormat;
   QTextCharFormat boldFormat;
   boldFormat.setFontWeight(QFont::Bold);
   QTextCharFormat italicFormat;
   italicFormat.setFontItalic(true);
   QTextTableFormat tableFormat;
   tableFormat.setBorder(1);
   tableFormat.setCellPadding(16);
   tableFormat.setAlignment(Qt::AlignRight);
   cursor.insertTable(1, 1, tableFormat);
   cursor.insertText("The Firm", boldFormat);
   cursor.insertBlock();
   cursor.insertText("321 City Street", textFormat);
   cursor.insertBlock();
   cursor.insertText("Industry Park");
   cursor.insertBlock();
   cursor.insertText("Some Country");
   cursor.setPosition(topFrame->lastPosition());
   cursor.insertText(QDate::currentDate().toString("d MMMM yyyy"), textFormat);
   cursor.insertBlock();
   cursor.insertBlock();
   cursor.insertText("Dear ", textFormat);
   cursor.insertText("NAME", italicFormat);
   cursor.insertText(",", textFormat);
   for (int i = 0; i < 3; ++i)
       cursor.insertBlock();
   cursor.insertText(tr("Yours sincerely,"), textFormat);
   for (int i = 0; i < 3; ++i)
       cursor.insertBlock();
   cursor.insertText("The Boss", textFormat);
   cursor.insertBlock();
   cursor.insertText("ADDRESS", italicFormat);

}

void MainWindow::print() {

  1. ifndef QT_NO_PRINTDIALOG
   QTextDocument *document = textEdit->document();
   QPrinter printer;
   QPrintDialog *dlg = new QPrintDialog(&printer, this);
   if (dlg->exec() != QDialog::Accepted)
       return;
   document->print(&printer);
   statusBar()->showMessage(tr("Ready"), 2000);
  1. endif

}

void MainWindow::save() {

   QString fileName = QFileDialog::getSaveFileName(this,
                       tr("Choose a file name"), ".",
                       tr("HTML (*.html *.htm)"));
   if (fileName.isEmpty())
       return;
   QFile file(fileName);
   if (!file.open(QFile::WriteOnly | QFile::Text)) {
       QMessageBox::warning(this, tr("Dock Widgets"),
                            tr("Cannot write file %1:\n%2.")
                            .arg(fileName)
                            .arg(file.errorString()));
       return;
   }
   QTextStream out(&file);
   QApplication::setOverrideCursor(Qt::WaitCursor);
   out << textEdit->toHtml();
   QApplication::restoreOverrideCursor();
   statusBar()->showMessage(tr("Saved "%1"").arg(fileName), 2000);

}

void MainWindow::undo() {

   QTextDocument *document = textEdit->document();
   document->undo();

}

void MainWindow::insertCustomer(const QString &customer) {

   if (customer.isEmpty())
       return;
   QStringList customerList = customer.split(", ");
   QTextDocument *document = textEdit->document();
   QTextCursor cursor = document->find("NAME");
   if (!cursor.isNull()) {
       cursor.beginEditBlock();
       cursor.insertText(customerList.at(0));
       QTextCursor oldcursor = cursor;
       cursor = document->find("ADDRESS");
       if (!cursor.isNull()) {
           for (int i = 1; i < customerList.size(); ++i) {
               cursor.insertBlock();
               cursor.insertText(customerList.at(i));
           }
           cursor.endEditBlock();
       }
       else
           oldcursor.endEditBlock();
   }

}

void MainWindow::addParagraph(const QString &paragraph) {

   if (paragraph.isEmpty())
       return;
   QTextDocument *document = textEdit->document();
   QTextCursor cursor = document->find(tr("Yours sincerely,"));
   if (cursor.isNull())
       return;
   cursor.beginEditBlock();
   cursor.movePosition(QTextCursor::PreviousBlock, QTextCursor::MoveAnchor, 2);
   cursor.insertBlock();
   cursor.insertText(paragraph);
   cursor.insertBlock();
   cursor.endEditBlock();

}

void MainWindow::about() {

  QMessageBox::about(this, tr("About Dock Widgets"),
           tr("The Dock Widgets example demonstrates how to "
              "use Qt"s dock widgets. You can enter your own text, "
              "click a customer to add a customer name and "
              "address, and click standard paragraphs to add them."));

} void MainWindow::createActions() {

   newLetterAct = new QAction(QIcon(":/images/new.png"), tr("&New Letter"),
                              this);
   newLetterAct->setShortcuts(QKeySequence::New);
   newLetterAct->setStatusTip(tr("Create a new form letter"));
   connect(newLetterAct, SIGNAL(triggered()), this, SLOT(newLetter()));
   saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save..."), this);
   saveAct->setShortcuts(QKeySequence::Save);
   saveAct->setStatusTip(tr("Save the current form letter"));
   connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));
   printAct = new QAction(QIcon(":/images/print.png"), tr("&Print..."), this);
   printAct->setShortcuts(QKeySequence::Print);
   printAct->setStatusTip(tr("Print the current form letter"));
   connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
   undoAct = new QAction(QIcon(":/images/undo.png"), tr("&Undo"), this);
   undoAct->setShortcuts(QKeySequence::Undo);
   undoAct->setStatusTip(tr("Undo the last editing action"));
   connect(undoAct, SIGNAL(triggered()), this, SLOT(undo()));
   quitAct = new QAction(tr("&Quit"), this);
   quitAct->setShortcut(tr("Ctrl+Q"));
   quitAct->setStatusTip(tr("Quit the application"));
   connect(quitAct, SIGNAL(triggered()), this, SLOT(close()));
   aboutAct = new QAction(tr("&About"), this);
   aboutAct->setStatusTip(tr("Show the application"s About box"));
   connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
   aboutQtAct = new QAction(tr("About &Qt"), this);
   aboutQtAct->setStatusTip(tr("Show the Qt library"s About box"));
   connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

} void MainWindow::createMenus() {

   fileMenu = menuBar()->addMenu(tr("&File"));
   fileMenu->addAction(newLetterAct);
   fileMenu->addAction(saveAct);
   fileMenu->addAction(printAct);
   fileMenu->addSeparator();
   fileMenu->addAction(quitAct);
   editMenu = menuBar()->addMenu(tr("&Edit"));
   editMenu->addAction(undoAct);
   viewMenu = menuBar()->addMenu(tr("&View"));
   menuBar()->addSeparator();
   helpMenu = menuBar()->addMenu(tr("&Help"));
   helpMenu->addAction(aboutAct);
   helpMenu->addAction(aboutQtAct);

} void MainWindow::createToolBars() {

   fileToolBar = addToolBar(tr("File"));
   fileToolBar->addAction(newLetterAct);
   fileToolBar->addAction(saveAct);
   fileToolBar->addAction(printAct);
   editToolBar = addToolBar(tr("Edit"));
   editToolBar->addAction(undoAct);

}

void MainWindow::createStatusBar() {

   statusBar()->showMessage(tr("Ready"));

}

void MainWindow::createDockWindows() {

   QDockWidget *dock = new QDockWidget(tr("Customers"), this);
   dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
   customerList = new QListWidget(dock);
   customerList->addItems(QStringList()
           << "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
           << "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
           << "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
           << "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
           << "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
           << "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
   dock->setWidget(customerList);
   addDockWidget(Qt::RightDockWidgetArea, dock);
   viewMenu->addAction(dock->toggleViewAction());
   dock = new QDockWidget(tr("Paragraphs"), this);
   paragraphsList = new QListWidget(dock);
   paragraphsList->addItems(QStringList()
           << "Thank you for your payment which we have received today."
           << "Your order has been dispatched and should be with you "
              "within 28 days."
           << "We have dispatched those items that were in stock. The "
              "rest of your order will be dispatched once all the "
              "remaining items have arrived at our warehouse. No "
              "additional shipping charges will be made."
           << "You made a small overpayment (less than $5) which we "
              "will keep on account for you, or return at your request."
           << "You made a small underpayment (less than $1), but we have "
              "sent your order anyway. We"ll add this underpayment to "
              "your next bill."
           << "Unfortunately you did not send enough money. Please remit "
              "an additional $. Your order will be dispatched as soon as "
              "the complete amount has been received."
           << "You made an overpayment (more than $5). Do you wish to "
              "buy more items, or should we return the excess to you?");
   dock->setWidget(paragraphsList);
   addDockWidget(Qt::RightDockWidgetArea, dock);
   viewMenu->addAction(dock->toggleViewAction());
   connect(customerList, SIGNAL(currentTextChanged(const QString &)),
           this, SLOT(insertCustomer(const QString &)));
   connect(paragraphsList, SIGNAL(currentTextChanged(const QString &)),
           this, SLOT(addParagraph(const QString &)));

}


  1. include <QApplication>
  2. include "mainwindow.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   Q_INIT_RESOURCE(dockwidgets);
   MainWindow mainWin;
   mainWin.show();
   return app.exec();

}


 </source>


Using QDockWidget

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the documentation of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef MAINWINDOW_H
  2. define MAINWINDOW_H
  3. include <QMainWindow>

class QDockWidget; class QListWidget; class QListWidgetItem; class QTextBrowser; class MainWindow : public QMainWindow {

   Q_OBJECT

public:

   MainWindow(QWidget *parent = 0);

private slots:

   void updateText(QListWidgetItem *item);

private:

   void setupContents();
   void setupDockWindow();
   void setupMenus();
   QDockWidget *contentsWindow;
   QListWidget *headingList;
   QTextBrowser *textBrowser;

};

  1. endif


  1. include <QtGui>
  2. include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

   : QMainWindow(parent)

{

   setWindowTitle("Dock Widgets");
   setupDockWindow();
   setupContents();
   setupMenus();
   textBrowser = new QTextBrowser(this);
   connect(headingList, SIGNAL(itemClicked(QListWidgetItem *)),
           this, SLOT(updateText(QListWidgetItem *)));
   updateText(headingList->item(0));
   headingList->setCurrentRow(0);
   setCentralWidget(textBrowser);

} void MainWindow::setupContents() {

   QFile titlesFile(":/Resources/titles.txt");
   titlesFile.open(QFile::ReadOnly);
   int chapter = 0;
   do {
       QString line = titlesFile.readLine().trimmed();
       QStringList parts = line.split("\t", QString::SkipEmptyParts);
       if (parts.size() != 2)
           break;
       QString chapterTitle = parts[0];
       QString fileName = parts[1];
       QFile chapterFile(fileName);
       chapterFile.open(QFile::ReadOnly);
       QListWidgetItem *item = new QListWidgetItem(chapterTitle, headingList);
       item->setData(Qt::DisplayRole, chapterTitle);
       item->setData(Qt::UserRole, chapterFile.readAll());
       item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
       chapterFile.close();
       chapter++;
   } while (titlesFile.isOpen());
   titlesFile.close();

} void MainWindow::setupDockWindow() {

   contentsWindow = new QDockWidget(tr("Table of Contents"), this);
   contentsWindow->setAllowedAreas(Qt::LeftDockWidgetArea
                                 | Qt::RightDockWidgetArea);
   addDockWidget(Qt::LeftDockWidgetArea, contentsWindow);
   headingList = new QListWidget(contentsWindow);
   contentsWindow->setWidget(headingList);

} void MainWindow::setupMenus() {

   QAction *exitAct = new QAction(tr("E&xit"), this);
   exitAct->setShortcut(tr("Ctrl+Q"));
   exitAct->setStatusTip(tr("Exit the application"));
   connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
   QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
   fileMenu->addAction(exitAct);

} void MainWindow::updateText(QListWidgetItem *item) {

   QString text = item->data(Qt::UserRole).toString();
   textBrowser->setHtml(text);

}



  1. include <QApplication>
  2. include "mainwindow.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   QMainWindow *window = new MainWindow;
   window->show();
   window->resize(640, 480);
   return app.exec();

}


 </source>