目录名字

  • Qt Dock Widgets 官方示例的翻译
    • Dock Widgets Example 介绍:
    • MainWindow Class 定义:
    • MainWindow Class 关联的相关头文件
    • 相关函数功能的介绍:
    • 总结:

Qt Dock Widgets 官方示例的翻译

Dock Widgets Example 介绍:

Dock Widgets 示例程序描述的有两个技术要点:

  • 1、如何添加Dock 窗体到应用程序中。
  • 2、如何使用Qt的富文本引擎。

该示例应用程序描述的是一个简单的处理商业邮件的模板程序。在两个Dock 窗体中分别显示了客户的信息 和 常用语。通过单击Dock中的列表,将自定添加选中的信息添加到邮件模板中。当然,撤销按钮可以撤去邮件模板中错误的或者不需要的信息。一旦邮件完成,可以直接答应或者保存为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 &paragraph);private:void createActions();void createStatusBar();void createDockWindows();QTextEdit *textEdit;QListWidget *customerList;QListWidget *paragraphsList;QMenu *viewMenu;};

接着,我们来一个个来了解每个函数的功能。

MainWindow Class 关联的相关头文件

#include
#if defined(QT_PRINTSUPPORT_LIB)
#include <QtPrintSupport/qtprintsupportglobal.h>
#if QT_CONFIG(printdialog)
#include
#endif
#endif

#include “mainwindow.h”

相关函数功能的介绍:

一开始我们包含了 ,QWidget类是所有用户界面对象的基类。我们同样需要包含mainwindow.h

  MainWindow::MainWindow(): textEdit(new QTextEdit){setCentralWidget(textEdit);createActions();createStatusBar();createDockWindows();setWindowTitle(tr("Dock Widgets"));newLetter();setUnifiedTitleAndToolBarOnMac(true);}

在该构造函数中,我们一开始就创建了QTextEdit Widget。 然后我们调用QMainWindow::setCentralWidget()。 该函数会将 QTextEdit 的所有权传递给 MainWindow ,同时QTextEdit 会占据MainWindow 的中央区域。

然后我们调用 createActions(), createMenus(), createToolBars(), createStatusBar(), and createDockWindows() 来初始化窗体.。
最后,我们调用 setWindowTitle() 来给用用程序设定一个名称, newLetter() 来创建一个邮件模板。

我们 调用 createActions(), createMenus(), createToolBars(), and createStatusBar() 函数,是为了保持和其他的Qt示例程序的风格保持一致。

  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);}

我们创建一个关于客户信息的Dock 窗体,设定了该窗体的标题,我们同时传递“this”指针,这样就指定了MainWindows为父窗体。一般情况下,我们不需要传递,因为当Widgets 陈列出时, 是自动继承父窗体的,但是Dock 窗体是个例外,因为它不是通过layouts 的方式来陈列的。

我们选择限制这个客户信息的Dock 窗体只能显示在左边和右边的Dock区域。关于Dock区域的图示,请看下图:

用户可以通过鼠标的拓展将Dock 移出,而变成一个自由窗体。通过QDockWidget::setFeatures()来设置Dock窗体是可移动的还是不可移动。

一旦我们创建好了Dock 窗体,创建好了list窗体,并指定list窗体的父窗体为Dock窗体,那么最后我们就可以调用addDockWidget()添加Dock 窗体到MainWindows 窗体中了。

我们依照同样的过程可以创建另一个Dock 窗体,这次我们不限定该窗体的区域位置。

最后,我们通过信号槽事件。关联信号currentTextChanged() ,到两个槽 insertCustomer() ,addParagraph() 。

接着,我们来讨论剩余的其他一些函数的实现。

  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);}

在该函数中,我们清空了QTextEdit。接着我们创建了一个QTextCursor ,我们移动光标到文档的开始处,创建并格式化一个frame。 我们创建一些字符格式和一个表格格式。我们插入一个表格到文档中,并参照上满的格式插入公司名和地址到表格中。接着我们插入包含标记NAME和ADDRESS的邮件“骨架”,我们用“Yours sincerely”,也作为一个标记。

  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, 会分割关于客户的信息。然后我们查找标记“NAME”,在该标记中插入客户的命名,同样的,我们查找标记“ADDRESS”,并将此标记替代为客户的地址。
值得注意的是:我们将所有的插入放置在beginEditBlock() 和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();}

该函数的功能类似于insertCustomer(). 首先我们寻找标记,这里的标记是“Yours sincerely”,然后在在标记前,插入单击选中的段落文本。同样的这里我们调用beginEditBlock() … endEditBlock()函数对,以便于我们撤销时,把整段添加的都一并撤销。

  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 类调用打印文档也非常简单。

  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();}

如果窗体的焦点放置在QTextEdit,可以通过撤销功能来撤销删除之前添加的文本。

总结:

  1、官方给定的示例对DockWidget 的使用做了简单介绍。2、富文本的应用这里也有涉及到。3、按照该示例程序的介绍可以很好的训练程序思维。

总之,按部就班的学习示例程序是学好Qt的一项基本策略。

ps:翻译有不当之处,请读者们多多指点,本人纯粹是为了项目和学习的需要,才斗胆拙笔成文。

Qt Dock Widgets 官方示例的翻译相关推荐

  1. logo qt添加_Qt官方示例-窗口标志

    窗口标志示例展示了如何使用Qt中可用的窗口标志类型来指定窗口系统属性. 根据示例整理出来的各窗口标志作用一览表如下: 只能设置一个的窗口标志对照表 窗口标志 描述 Qt::QWidget 窗口的默认属 ...

  2. qt 设置按钮大小_Qt官方示例双向按钮

    "双向按钮"示例演示了如何使用状态机框架实现简单的状态机,该状态机在单击按钮时切换当前状态.   应用程序的main()函数从构造应用程序对象,按钮和状态机开始. int main ...

  3. 撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页

    从2018年12月02日决定开始做ML.NET 示例中文版https://github.com/feiyun0112/machinelearning-samples.zh-cn,然后以每天一篇的速度进 ...

  4. Qt官方示例-QLineEdit编辑器

    基于QLineEdit而写的文本单行编辑器.   上手使用了该编辑器示例,并归纳出以下主要功能分享给大家. 回显模式   根据不同的场合显示字符的不同显示模式,比较常用的模式有密码模式. 使用接口: ...

  5. Qt官方示例-正则测试工具

    该正则测试工具(regularexpression)是基于Qt 5.0新引入的QRegularExpression类实现的.   QRegularExpression实现与Perl兼容的正则表达式,支 ...

  6. Qt官方示例-计算器

    该示例显示了如何使用信号和槽来实现计算器小部件的功能,以及如何使用QGridLayout将子小部件放置在网格中. 通过绑定不同的按钮和不同的槽函数实现计算功能. private slots:void ...

  7. Qt官方示例-数字时钟

    基于QLCDNumber实现的LCD的时钟显示.   DigitalClock继承于QLCDNumber,并实现一个槽函数showTime()用来定时更新时钟显示: class DigitalCloc ...

  8. Qt官方示例-拖动图标

    拖动图标示例显示了如何在同一应用程序中的小部件之间以及不同应用程序之间拖放图像数据.   在使用拖放的许多情况下,用户开始从特定的窗口小部件拖放,并将有效负载拖放到另一个窗口小部件上.在此示例中,我们 ...

  9. Qt5.15.2+VLC3.0.14学习笔记(六)Qt Player测试(官方示例 vlc-qt+mingw_64版)

    前记: Qt Player是官方源码中的一个示例,好像已经很久没有更新了,今天运行测试了下,需要修改部分内容才能运行 vlc-3.0.14源码下载地址:https://code.videolan.or ...

最新文章

  1. 制作TortoiseSVN最新版本的中文DLL(转)
  2. linux Json c++库
  3. C++中的NULL与DELPHI中的nil作用相同
  4. 绝非玩笑!人工智能或开创黑客新时代
  5. 在 Delphi 中调用 JavaScript(二)
  6. mysql5.7.11解压安装_mysql 5.7.11解压安装教程
  7. hadoop2.7的目录结构
  8. 安装pd15提示“无法启动 Parallels Desktop,因为 Mac 的操作系统中缺少某些必需的组件”是怎么回事儿?
  9. Aiseesoft Screen Recorder入门教程
  10. 三包围结构的字是什么样的_清桦学书之结构篇——包围结构。
  11. boost python错误_Ubuntu-链接boost.python-致命错误:找不到pyconfig
  12. 2022美国大学生数学建模竞赛(美赛)思路代码
  13. 用户认证授权系统方案思考
  14. Python实现股票涨跌预测——随机森林模型
  15. CF大陆斗C战士(三)
  16. 优化理论12---- Rosen的梯度投影法 、投影矩阵
  17. python视频压缩_Python 怎样将视频压缩?并且尽量不会影响到清晰度
  18. 1万条数据大概占多大空间_圆通内鬼泄露40万条个人信息背后:不仅快递,你的简历也被卖了-科技频道...
  19. 电商的转折——真正的垂直电商
  20. 免费矢量图标网站都有哪些,推荐这10个

热门文章

  1. 坐标系旋转变换公式图解
  2. 论文阅读:Deep Filter Banks for Texture Recognition and Segmentation
  3. 利用matlab对xml文件进行批量处理
  4. [云炬创业基础笔记]第二章创业者测试13
  5. [2dPIC调试笔记]初始化变量1014(2)
  6. linux read01,Linux内置命令之read
  7. python函数编程训练题_Python文件与函数练习题
  8. 无法解析的外部符号 __imp____glutInitWithExit@12
  9. 将输出的数据按照表格的形式进行输出
  10. struts2 跳转类型 result type=chain、dispatcher、redirect