1.对话框的概念
对话框是与用户进行简短交互的顶层窗口
QDialog是Qt中所有对话框窗口的基类
QDialog继承于QWidget是一种容器类型的组件
在这里插入图片描述QDialog的意义:
QDialog作为一种专用的交互窗口而存在
QDialog不能作为子部件嵌入其他容器中
QDialog是定制了窗口式样的特殊的QWidget

编程实验:QDialog和QWidget的区别

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    QDialog dialog(&w);

    QDialog dialog;
    QWidget w(&dialog);


    dialog.show();
    dialog.setWindowTitle("I am dialog");


    w.show();
    w.setWindowTitle("I am widget");

    return a.exec();
}

2.对话框的类型
模态对话框(QDialog::exec()):
显示后无法与父窗口进行交互
是一种阻塞式的对话框调用方式
非模态对话框(QDialog::show()):
显示后独立存在可以同时与父窗口进行交互
是一种非阻塞式的对话框调用方式

一般情况下:
模态对话框用于必须依赖用户选择的场合(80%):消息提示,文件选择,打印设置等
非模态对话框用于特殊功能设置的场合(20%):查找操作,属性设置等

小技巧:
上创建模式对话框是最简单常用的方式
一般情况下非模态对话框需要在上创建
通过QDialog::setModal函数可以创建混合特性的对话框
非模态对话框需要指定Qt::WA_DelateOnClose属性

对话框的返回值:
只有模态对话框才有返回值的概念
模态对话框的返回值用于表示交互结果
QDialog::exec()的返回值为交互结果
void QDialog::done(int i)关闭对话框并将参数作为交互结果
QDialog::Accepted 用户操作成功
QDialog::Rejected 用户操作失败

编程实验:不同特性的对话框以及对话框的返回值
Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QtGui/QDialog>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT
protected:
    QPushButton ModalBtn;
    QPushButton NormalBtn;
    QPushButton MixedBtn;
protected slots:
    void ModalBtn_Clicked();
    void NormalBtn_Clicked();
    void MixedBtn_Clicked();
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H

Dialog.c

#include "Dialog.h"

#include <QDebug>

Dialog::Dialog(QWidget *parent) :
        QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
{
    ModalBtn.setText("Modal Dialog");
    ModalBtn.move(20, 20);
    ModalBtn.resize(100, 30);

    NormalBtn.setText("Normal Dialog");
    NormalBtn.move(20, 70);
    NormalBtn.resize(100, 30);

    MixedBtn.setText("Mixed Dialog");
    MixedBtn.move(20, 120);
    MixedBtn.resize(100, 30);

    connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));
    connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));
    connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));

    resize(140, 170);
}

void Dialog::ModalBtn_Clicked()
{
    qDebug() << "ModalBtn_Clicked() Begin";

    QDialog dialog(this);

    dialog.exec();

    // done(Accepted);

    qDebug() << "ModalBtn_Clicked() End";
}

void Dialog::NormalBtn_Clicked()
{
    qDebug() << "NormalBtn_Clicked() Begin";

    QDialog* dialog = new QDialog(this);

    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();

    // done(Rejected);

    qDebug() << "NormalBtn_Clicked() End";
}

void Dialog::MixedBtn_Clicked()
{
    qDebug() << "MixedBtn_Clicked() Begin";

    QDialog* dialog = new QDialog(this);

    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->setModal(true);
    dialog->show();

    // done(100);

    qDebug() << "MixedBtn_Clicked() End";
}

Dialog::~Dialog()
{
    qDebug() << "~Dialog()";
}

main.c

#include <QtGui/QApplication>
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "Dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog dlg;
    int r = dlg.exec();

    if( r == QDialog::Accepted )
    {
        qDebug() << "Accepted";
    }
    else if( r == QDialog::Rejected )
    {
        qDebug() << "Rejected";
    }
    else
    {
        qDebug() << r;
    }

    return r;
    //return a.exec();  //进入消息循环,进入两次消息循环,如果以模态对话框作为程序运行主窗口,不要调用a.exec();
}

2.登录对话框实例分析

登录对话框是应用程序中的常用部件
思考:如何开发一个可以在不同项目间复用的登录对话框?

登录对话框需求分析:
可复用软件部件
获取用户名和密码
附加需求:
随机验证码

如何获取用户输入的用户名和密码?
如何在不同的对话框间传递数据?
在这里插入图片描述
通过附加的成员变量和成员函数完成不同对话框间的数据传递!
将用户数据保存在私有成员变量中
通过公有函数进行数据传递

检查用户名和密码是否为空
当用户名或密码为空时提示错误
随意验证码
当随机验证码输入错误进行提示
验证码随机刷新

实例分析:登录对话框实现以及对话框间的数据传递

3.Qt中的标准对话框(上)
标准化对话框:
Qt为开发者提供了一些可复用的对话框类型
Qt提供的可复用对话框全部继承自QDialog类
在这里插入图片描述
Qt中的标准对话框遵循相同的使用方式:
在这里插入图片描述
消息对话框:
(1)消息对话框是应用程序中最常见的界面元素
(2)消息对话框主要用于:
为用户提示重要信息
强制用户进行操作选择
在这里插入图片描述消息对话框的使用方式:
QMessageBox用于提示重要的程序信息
在这里插入图片描述QMessageBox中实用函数:
QMessageBox::question
QMessageBox::information
QMessageBox::warning
QMessageBox::critical
QmessageBox::about

文件对话框:
文件对话框常用于以下情形:
Open Mode:应用程序中需要打开一个外部的文件
Save Mode:应用程序中将当前内容存储于用户指定的外部文件中

文件对话框的使用方式:
QFileDialog用于获取系统中的文件路径
在这里插入图片描述文件类型过滤器:
在文件对话框中可以通过文件后缀定义过滤器
过滤器定义规则:
显示器(.后缀1.后缀2…)
例如:

"Image(*.png *.xpm *.jpg)"
"Text(*.txt)"
"All(*.*)"

fd.setFilter("Text(*.txt)");

QFileDialog中的实用函数:
QFileDialog::getOpenFileName
QFileDialog::getOpenFileNames
QFileDialog::getSaveFileName

4.Qt中的标准对话框(中)
颜色对话框:
(1)Qt中提供了预定义的颜色对话框QColorDialog
(2)QColorDialog类用于提供指定颜色的对话框部件

颜色对话框的使用方式:
指定颜色:dlg.setCurrentColor(QColor(100,100,100));
在这里插入图片描述
Qt中的QColor类用在程序中表示颜色的概念
QColor类同时支持多种颜色表示方式
RGB:以红,绿,蓝为基准的三色模型
HSV:以色调,饱和度,明度为基准的六角椎体模型
CMYK:以天蓝,品红,黄色,黑为基准的全彩印刷色彩模型

QColorDialog中的实用函数:
QColorDialog::getColor

输入对话框:
Qt中提供了预定义的输入对话框QInputDialog类
QInputDialog类用于需要临时进行数据输入的场合
在这里插入图片描述输入对话框的使用方式:

在这里插入图片描述输入对话框的输入模式:
QInputDialog::TextInput 输入文本字符串 dig.textValue()
QInputDialog::IntInput 输入整形数 dig.intValue()
QInputDialog::DoubleInput 输入浮点数

QInputDialog中的实用函数:
QInputDialog::getDouble
QInputDialog::getInt
QInputDialog::getItem
QInputDialog::getText

5.Qt中的标准对话框(下)
字体对话框:
Qt中提供了预定义的字体对话框QFontDialog类
QFontDialog类用于提供选择字体的对话框部件
在这里插入图片描述字体对话框的使用方式:
在这里插入图片描述QFontDialog中的实用函数:
QFontDialog::getFont

Qt中提供了预定义的进度对话框QProgressDialog类
QProgressDialog类用于显示进度信息
QProgressDialog类用于需要用户等待的场合
在这里插入图片描述进度对话框的使用方式:
dlg.setValue(35);
在这里插入图片描述
打印对话框:
Qt中提供了预定义的打印对话框QPrintDialog类
QPrintDialog类用于设置打印相关的参数信息

打印对话框的使用方式:
在这里插入图片描述Qt中的QPrinter类是打印设备及其参数的封装
QPrinter类封装了系统中打印设备的驱动接口
QPrinter以相同方式使用系统中的不同打印
在这里插入图片描述
小结:
Qt中标准对话框的设计模式:
GUI界面部件产生数据对象
业务逻辑中的其他对象使用数据对象
GUI界面与业务逻辑通过数据对象连接
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐