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

原文地址:http://blog.51cto.com/12810168/2094526

时间: 2024-10-04 23:03:31

QT之字体、进度、打印对话框的相关文章

【转】24. android dialog ——ProgressDialog 进度条对话框详解

原文网址:http://blog.csdn.net/jamesliulyc/article/details/6375598 首先在onCreateDialog方法里创建一个ProgressDialog,如下: [java] view plaincopy //this表示该对话框是针对当前Activity的 progressDialog = new ProgressDialog(this); //设置最大值为100 progressDialog.setMax(100); //设置进度条风格STYL

printf 字体颜色打印

为了给printf着色方便, 我们可以定义一些宏: view plain copy to clipboard print ? #define NONE          "/033[m" #define RED           "/033[0;32;31m" #define LIGHT_RED     "/033[1;31m" #define GREEN         "/033[0;32;32m" #define LI

进度条对话框ProgressDialog

进度条对话框ProgressDialog经常用于不能马上完成的操作,为了避免用户莫名其妙的等待,给用户一个提示. 本例中我们演示了两种进度条:条形进度条和圆形进度条. 一.设计界面 1.打开"res/layout/activity_main.xml"文件. 从工具栏向activity拖出2个按钮Button. 2.打开activity_main.xml文件. 代码如下: <LinearLayout xmlns:android="http://schemas.androi

QT 使用QSS实现圆角对话框

QT 使用QSS实现圆角对话框 圆角对话框有很多办法,一般是用代码重绘的方式,比较复杂,这一个高仿360的界面给的代码,比较复杂,放入我的QDialog的窗口总是不生效: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); setWindowFlags(Qt::FramelessWindowHint);//隐藏边框和标题栏 //生成一张位

Qt第三方圆形进度条-及其改进

Qt第三方圆形进度条的改进 要实现一个圆形的进度条功能,在网上找到一个比较出名的第三方封装类:QRoundProgressBar,地址:sourceforge 的 QRoundProgressBar 功能封装的还是不错,提供了3种模式,线形.圆环.饼状.使用过程中发现圆环进度条对背景透明支持不够完善,内圆的背景无法实现透明,为了解决此问题,下面对此控件进行了一些修订,实现完整的圆形进度条. QRoundProgressBar目前存在的不足 QRoundProgressBar在带背景图片widge

Android 进度条对话框ProgressDialog

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:ori

C# 使用printDocument1.Print打印时不显示 正在打印对话框

C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController PrintController printController = new StandardPrintController(); printDocument1.PrintController = printController; printDocument1.Print(); 第二种,把窗体的TopMost设为True

Delphi7 调用 Windows 照片查看器打印对话框

Delphi7 调用 Windows 照片查看器打印对话框. uses ShellAPI; var strPictureFilePath: string; begin ShellExecute(Handle, 'print', PChar(strPictureFilePath), nil, nil, SW_SHOW); end;

关于安卓开发实现进度条对话框

进度条对话框(ProgressDialog)分为圆形和横向两种类型. 方法: onCreatDialog(int id);创建一个对话框,只有在第一次创建该ID标识的Dialog时执行 onCreatDialog(int id,Bundle args);同上,带参数 onPrepareDialog(int id,Dialog dialog);在onCreateDialog之后,每次在对话框被显示之前都执行 onPrepareDialog(int id,Dialog dialog,Bundle a