QT之字体进度打印对话框
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT之字体进度打印对话框相关的知识,希望对你有一定的参考价值。
在上节博客中我们介绍了颜色对话框。那么在日常生活中,除了颜色对话框,我们经常见到的还有字体对话框、进度对话框以及打印对话框。本节我们就来介绍下咋 QT 中这三个对话框是怎样实现的。
我们首先建立一个带有 FontDialogBtn、ProgressDialogBtn、PrintDialogBtn 三个 QPushButton 按钮来分别实现字体对话框、进度对话框以及打印对话框,代码如下:
Widget.h 如下所示:
#include <QWidget>#include <QPushButton> class Widget : public QWidget { Q_OBJECT private: QPushButton FontDialogBtn; QPushButton ProgressDialogBtn; QPushButton PrintDialogBtn; private slots: void FontDialogBtn_Clicked(); void ProgressDialogBtn_Clicked(); void PrintDialogBtn_Clicked(); public: Widget(QWidget *parent = 0); ~Widget(); };
Widget.cpp 如下所示:
#include "Widget.h" #include <QDebug> #include <QTextDocument> #include <QPrinter> #include <QPrintDialog> #include <QProgressDialog> #include <QFontDialog> Widget::Widget(QWidget *parent) : QWidget(parent), FontDialogBtn(this), ProgressDialogBtn(this), PrintDialogBtn(this) { FontDialogBtn.setText("Font Dialog"); FontDialogBtn.move(20, 20); FontDialogBtn.resize(160, 30); ProgressDialogBtn.setText("Progress Dialog"); ProgressDialogBtn.move(20, 70); ProgressDialogBtn.resize(160, 30); PrintDialogBtn.setText("Print Dialog"); PrintDialogBtn.move(20, 120); PrintDialogBtn.resize(160, 30); resize(200, 170); setFixedSize(200, 170); connect(&FontDialogBtn, SIGNAL(clicked()), this, SLOT(FontDialogBtn_Clicked())); connect(&ProgressDialogBtn, SIGNAL(clicked()), this, SLOT(ProgressDialogBtn_Clicked())); connect(&PrintDialogBtn, SIGNAL(clicked()), this, SLOT(PrintDialogBtn_Clicked())); } void Widget::FontDialogBtn_Clicked() { } void Widget::ProgressDialogBtn_Clicked() { } void Widget::PrintDialogBtn_Clicked() { } Widget::~Widget() { }
我们构建后,发现出现一个错误,说 QPrintDialog 头文件没定义,可是我们在帮助里查到 QPrintDialog是这个头文件里,那么为什么会报错呢?经过仔细查看,在包含头文件下面有
qmake: | QT += printsupport |
这么一行话,我们就在 test.pro 文件里加上这句,那么下面我们构建既不会出错了。运行之后出现我们期待的界面,如下:
但是我们点击之后,并没有什么反应。当然了,对应函数的内容还没有实现呢。下来我们就来一一实现三个对话框。我们就先来实现一个字体对话框。
首先在 Qt 中提供了预定义的字体对话框 QFontDialog 类, QFontDialog 类用于提供选择字体的对话框部件。字体对话框的使用方式大体如下:
具体到代码就是:
void Widget::FontDialogBtn_Clicked() { QFontDialog dlg(this); dlg.setWindowTitle("Font Dialog Test"); dlg.setCurrentFont(QFont("Courier New", 10, QFont::Bold)); // 设置属性:名字为Courier New,大小为10,类型为Bold if( dlg.exec() == QFontDialog::Accepted ) { qDebug() << dlg.selectedFont(); } }
构建运行后,得到的效果图如下:
那么我们得到的属性是不是和上面我们设置的一样呢?我们点击OK,打印出来的属性如下所示:
接下来我们就来实现进度对话框,那么在 Qt 中也提供了预定义的进度对话框 QProgressDialog 类,QProgressDialog 类用于显示进度信息,QProgressDialog 类用于需要用户等待的场合。那么我们进度对话框的使用大体流程如下:
具体代码如下:
void Widget::ProgressDialogBtn_Clicked() { QProgressDialog dlg(this); dlg.setWindowTitle("Updating..."); // 设置名字 dlg.setLabelText("Downloading update from server..."); // 设置对话框信息 dlg.setMinimum(0); // 设置最小值 dlg.setMaximum(100); // 设置最大值 dlg.setValue(35); // 设置进度条信息 dlg.exec(); }
构建运行后得到如图所示的进度对话框:
接下来我们继续实现打印对话框。那么在 Qt 中也提供了预定义的打印对话框 QPrintDialog 类,QPrintDialog 类用于设置打印相关的参数信息。Qt 中的 QPrinter 类是打印设备及其参数的封装,QPrinter 类封装了系统中打印设备的驱动接口,QPrinter 以相同方式使用系统中的不同打印设备。
打印对话框的大体使用流程如下:
具体到代码入如下:
void Widget::PrintDialogBtn_Clicked() { QPrintDialog dlg(this); dlg.setWindowTitle("Print Dialog Test"); if( dlg.exec() == QPrintDialog::Accepted ) { QPrinter* p = dlg.printer(); QTextDocument td; td.setPlainText("Printer object test!"); // 文件内容是Printer object test! p->setOutputFileName("F:\\test.pdf"); // 在F盘生成test.pdf文件 td.print(p); } }
在这里我们使用的虚拟打印机,选择PDF格式的,得到的效果图如下:
我们打开F盘,如下,我们发现文件生成的时间就是刚才。再打开看下内容就是我们刚设置的。
我们还可以再做个试验,加上 td.sethtml("<h1>Print html object test</hl>"); 这句,再将文件类型改成 .xps 格式的。构建运行,选择 XPS 虚拟打印机进行打印,如下:
我们再到F盘看看,生成 text.xps 文件,内容和刚才一样。如下:
那么我们今天学习了字体对话框、进度对话框以及打印对话框三种对话框的相关知识,那么在 Qt 中标准对话框的设计模式就是:1、GUI界面部件产生数据对象;2、业务逻辑中的其它对象使用数据对象;3、GUI界面与业务逻辑用过数据对象链接。今天的学习就到此啦,后面我们继续学习 Qt 相关的知识。
以上内容来自狄泰软件学院的QT教程,欢迎大家一起来学习,可以加我QQ:243343083,一起学习。狄泰技术交流群:199546072
以上是关于QT之字体进度打印对话框的主要内容,如果未能解决你的问题,请参考以下文章
自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段