Mega Code Archive

 
Categories / C++ / Qt
 

Docking widget

/**************************************************************************** ** ** 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$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #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; }; #endif #include <QtGui> #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() { #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); #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 <b>Dock Widgets</b> 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 &))); } #include <QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) {     QApplication app(argc, argv);     Q_INIT_RESOURCE(dockwidgets);     MainWindow mainWin;     mainWin.show();     return app.exec(); }