Qt Dock Widgets 官方示例的翻译
目錄名字
- Qt Dock Widgets 官方示例的翻譯
- Dock Widgets Example 介紹:
- MainWindow Class 定義:
- MainWindow Class 關(guān)聯(lián)的相關(guān)頭文件
- 相關(guān)函數(shù)功能的介紹:
- 總結(jié):
Qt Dock Widgets 官方示例的翻譯
Dock Widgets Example 介紹:
Dock Widgets 示例程序描述的有兩個(gè)技術(shù)要點(diǎn):
- 1、如何添加Dock 窗體到應(yīng)用程序中。
- 2、如何使用Qt的富文本引擎。
該示例應(yīng)用程序描述的是一個(gè)簡單的處理商業(yè)郵件的模板程序。在兩個(gè)Dock 窗體中分別顯示了客戶的信息 和 常用語。通過單擊Dock中的列表,將自定添加選中的信息添加到郵件模板中。當(dāng)然,撤銷按鈕可以撤去郵件模板中錯(cuò)誤的或者不需要的信息。一旦郵件完成,可以直接答應(yīng)或者保存為HTML格式。
MainWindow Class 定義:
class MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow();private slots:void newLetter();void save();void print();void undo();void about();void insertCustomer(const QString &customer);void addParagraph(const QString ¶graph);private:void createActions();void createStatusBar();void createDockWindows();QTextEdit *textEdit;QListWidget *customerList;QListWidget *paragraphsList;QMenu *viewMenu;};接著,我們來一個(gè)個(gè)來了解每個(gè)函數(shù)的功能。
MainWindow Class 關(guān)聯(lián)的相關(guān)頭文件
#include
#if defined(QT_PRINTSUPPORT_LIB)
#include <QtPrintSupport/qtprintsupportglobal.h>
#if QT_CONFIG(printdialog)
#include
#endif
#endif
#include “mainwindow.h”
相關(guān)函數(shù)功能的介紹:
一開始我們包含了 ,QWidget類是所有用戶界面對(duì)象的基類。我們同樣需要包含mainwindow.h
MainWindow::MainWindow(): textEdit(new QTextEdit){setCentralWidget(textEdit);createActions();createStatusBar();createDockWindows();setWindowTitle(tr("Dock Widgets"));newLetter();setUnifiedTitleAndToolBarOnMac(true);}在該構(gòu)造函數(shù)中,我們一開始就創(chuàng)建了QTextEdit Widget。 然后我們調(diào)用QMainWindow::setCentralWidget()。 該函數(shù)會(huì)將 QTextEdit 的所有權(quán)傳遞給 MainWindow ,同時(shí)QTextEdit 會(huì)占據(jù)MainWindow 的中央?yún)^(qū)域。
然后我們調(diào)用 createActions(), createMenus(), createToolBars(), createStatusBar(), and createDockWindows() 來初始化窗體.。
最后,我們調(diào)用 setWindowTitle() 來給用用程序設(shè)定一個(gè)名稱, newLetter() 來創(chuàng)建一個(gè)郵件模板。
我們 調(diào)用 createActions(), createMenus(), createToolBars(), and createStatusBar() 函數(shù),是為了保持和其他的Qt示例程序的風(fēng)格保持一致。
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, &QListWidget::currentTextChanged,this, &MainWindow::insertCustomer);connect(paragraphsList, &QListWidget::currentTextChanged,this, &MainWindow::addParagraph);}我們創(chuàng)建一個(gè)關(guān)于客戶信息的Dock 窗體,設(shè)定了該窗體的標(biāo)題,我們同時(shí)傳遞“this”指針,這樣就指定了MainWindows為父窗體。一般情況下,我們不需要傳遞,因?yàn)楫?dāng)Widgets 陳列出時(shí), 是自動(dòng)繼承父窗體的,但是Dock 窗體是個(gè)例外,因?yàn)樗皇峭ㄟ^layouts 的方式來陳列的。
我們選擇限制這個(gè)客戶信息的Dock 窗體只能顯示在左邊和右邊的Dock區(qū)域。關(guān)于Dock區(qū)域的圖示,請(qǐng)看下圖:
用戶可以通過鼠標(biāo)的拓展將Dock 移出,而變成一個(gè)自由窗體。通過QDockWidget::setFeatures()來設(shè)置Dock窗體是可移動(dòng)的還是不可移動(dòng)。
一旦我們創(chuàng)建好了Dock 窗體,創(chuàng)建好了list窗體,并指定list窗體的父窗體為Dock窗體,那么最后我們就可以調(diào)用addDockWidget()添加Dock 窗體到MainWindows 窗體中了。
我們依照同樣的過程可以創(chuàng)建另一個(gè)Dock 窗體,這次我們不限定該窗體的區(qū)域位置。
最后,我們通過信號(hào)槽事件。關(guān)聯(lián)信號(hào)currentTextChanged() ,到兩個(gè)槽 insertCustomer() ,addParagraph() 。
接著,我們來討論剩余的其他一些函數(shù)的實(shí)現(xiàn)。
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);}在該函數(shù)中,我們清空了QTextEdit。接著我們創(chuàng)建了一個(gè)QTextCursor ,我們移動(dòng)光標(biāo)到文檔的開始處,創(chuàng)建并格式化一個(gè)frame。 我們創(chuàng)建一些字符格式和一個(gè)表格格式。我們插入一個(gè)表格到文檔中,并參照上滿的格式插入公司名和地址到表格中。接著我們插入包含標(biāo)記NAME和ADDRESS的郵件“骨架”,我們用“Yours sincerely”,也作為一個(gè)標(biāo)記。
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();}elseoldcursor.endEditBlock();}}如果用戶單擊了客戶信息的Dock, 會(huì)分割關(guān)于客戶的信息。然后我們查找標(biāo)記“NAME”,在該標(biāo)記中插入客戶的命名,同樣的,我們查找標(biāo)記“ADDRESS”,并將此標(biāo)記替代為客戶的地址。
值得注意的是:我們將所有的插入放置在beginEditBlock() 和endEditBlock() 這兩個(gè)函數(shù)之間。
該函數(shù)的功能類似于insertCustomer(). 首先我們尋找標(biāo)記,這里的標(biāo)記是“Yours sincerely”,然后在在標(biāo)記前,插入單擊選中的段落文本。同樣的這里我們調(diào)用beginEditBlock() … endEditBlock()函數(shù)對(duì),以便于我們撤銷時(shí),把整段添加的都一并撤銷。
void MainWindow::print(){#if QT_CONFIG(printdialog)QTextDocument *document = textEdit->document();QPrinter printer;QPrintDialog dlg(&printer, this);if (dlg.exec() != QDialog::Accepted) {return;}document->print(&printer);statusBar()->showMessage(tr("Ready"), 2000);#endif}可以看到,Qt 的QTextDocument 類調(diào)用打印文檔也非常簡單。
void MainWindow::save(){QMimeDatabase mimeDatabase;QString fileName = QFileDialog::getSaveFileName(this,tr("Choose a file name"), ".",mimeDatabase.mimeTypeForName("text/html").filterString());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(QDir::toNativeSeparators(fileName), file.errorString()));return;}QTextStream out(&file);QGuiApplication::setOverrideCursor(Qt::WaitCursor);out << textEdit->toHtml();QGuiApplication::restoreOverrideCursor();statusBar()->showMessage(tr("Saved '%1'").arg(fileName), 2000);}QTextEdit 提供輸出HTML格式的文檔。
void MainWindow::undo(){QTextDocument *document = textEdit->document();document->undo();}如果窗體的焦點(diǎn)放置在QTextEdit,可以通過撤銷功能來撤銷刪除之前添加的文本。
總結(jié):
1、官方給定的示例對(duì)DockWidget 的使用做了簡單介紹。2、富文本的應(yīng)用這里也有涉及到。3、按照該示例程序的介紹可以很好的訓(xùn)練程序思維。總之,按部就班的學(xué)習(xí)示例程序是學(xué)好Qt的一項(xiàng)基本策略。
ps:翻譯有不當(dāng)之處,請(qǐng)讀者們多多指點(diǎn),本人純粹是為了項(xiàng)目和學(xué)習(xí)的需要,才斗膽拙筆成文。
總結(jié)
以上是生活随笔為你收集整理的Qt Dock Widgets 官方示例的翻译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Qt创建XML文档及XML文档的增删
- 下一篇: Qt 2D painting Demo