一、对话框简介

对话框是与用户进行简短交互的顶层窗口

QDialog是QT中所有对话框窗口的基类,QDialog继承于QWidget,是一种容器型的组件,是定制了窗口样式的特殊QWidget。

QDialog作为一种专用的交互窗口,不能作为子部件嵌入其他容器中。

二、对话框类型

对话框类型分为模态对话框和非模态对话框。

1、模态对话框

模态对话框显示后无法与父窗口进行交互,是一种阻塞式的对话框,使用QDialog::exec()函数调用。

模态对话框一般在栈上创建。

QDialog dialog(this);dialog.exec();

模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等。

2、非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用QDialog::show()函数调用。

非模态对话框一般在堆上创建,需要指定Qt:WA_DeleteOnClose属性,避免内存泄漏。

非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等。

QDialog* dialog = new QDialog(this);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();

3、混合属性对话框

混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框的属性。

使用QDialog::setModal()函数可以创建混合特性的对话框。通常,创建对话框都需要指定对话框的父组件。

QDialog* dialog = new QDialog(this);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->setModal(true);dialog->show();

三、对话框的返回值

只有模态对话框采用返回值,模态对话框的返回值用于表示交互结果。

QDialog::exec()函数的返回值作为交互结果。

void QDialog::done(int i)函数关闭对话框,并将参数作为交互结果。

QDialog::Accepted表示用户操作成功

QDialog::Rejected表示用户操作失败

如果对话框以模态方式运行作为程序主窗口,主程序main函数不能在此调用a.exec(),避免在此进入消息事件循环。

四、标准对话框

1、标准对话框的类型

QT为开发者提供了多种可复用的对话框类型,即QT标准对话框。QT标准对话框全部继承于QDialog类。常用标准对话框类型如下:

对话框对象的定义

QDialogType dialog(this);

对话框属性设置

dialog.setPropertyxxxx(value);if(dialog.exec() == QDialogType::vaule)
{Type v = dialog.getDialogValue();
}

2、消息对话框QMessageBox

消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。

消息对话框的使用方式如下:

A、创建消息对话框对象

QMessageBox msg(this);

B、设置消息对话框属性

msg.setWindowTitle(“Warning Message”);
msg.setText(“Error Massage!”);
msg.setIcon(QMessageBox::Information);
msg.setStandardButtons(QMessageBox::Ok | QMessage::Cancel);if(dialog.exec() == QMessageBox::Ok)
{
//
}

C、QMessageBox实用函数

QMessageBox定义了静态成员函数,可以直接调用创建不同风格的消息对话框。

StandardButton information(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)StandardButton question(QWidget * parent, const QString & title, const QString& text,StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)StandardButton warning(QWidget * parent, const QString & title, const QString& text,StandardButtons buttons = Ok, StandardButtondefaultButton = NoButton)StandardButton critical(QWidget * parent, const QString & title, const QString& text,StandardButtons buttons = Ok, StandardButton defaultButton= NoButton)void about(QWidget * parent, const QString & title, const QString & text)

3、文件对话框QFileDialog

文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件。

文件对话框的使用方式如下

A、创建文件对话框对象

QFileDialog fdialog(this);

B、文件对话框属性设置

打开文件设置如下:

    fdialog.setAcceptMode(QFileDialog::AcceptOpen);//选择打开多个文件QFileDialog::ExistingFilesfdialog.setFileMode(QFileDialog::ExistingFile);if(fdialog.exec() == QFileDialog::Accepted){QStringList s = fdialog.selectedFiles();for(int i = 0; i < s.count(); i++){qDebug() << s[i];}}

保存文件设置如下:

    fdialog.setAcceptMode(QFileDialog::AcceptSave);if(fdialog.exec() == QFileDialog::Accepted){QStringList s = fdialog.selectedFiles();for(int i = 0; i < s.count(); i++){qDebug() << s[i];}}

C、文件类型过滤器

在文件对话框中可以通过文件后缀定义文件过滤器。文件过滤器定义规则如下:

显示名(*.后缀名1 *.后缀名2 ...*.后缀名n)

Image(*.jpg *.png)
Text(*.txt)
All(*.*)
fdialog.setFilter("Image(*.png *.jpg)");

D、文件对话框实用函数

QFileDialog定义了多个静态成员函数用于直接使用文件对话框。

QString getOpenFileName(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString& filter = QString(), QString * selectedFilter = 0, Options options = 0)QStringList getOpenFileNames(QWidget * parent = 0, const QString& caption = QString(),     const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)QString getSaveFileName(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString& filter = QString(), QString * selectedFilter = 0, Options options = 0)

4、颜色对话框QColorDialog

QT中也提供了预定义的颜色对话框类QColorDialog。颜色对话框使用方式如下:

A、创建颜色对话框QColorDialog对象

QColorDialog cdialog(this);

B、颜色对话框属性设置

    cdialog.setWindowTitle("Color Editer");//设置初始颜色cdialog.setCurrentColor(Qt::red);if(cdialog.exec() == QColorDialog::Accepted){qDebug() << cdialog.selectedColor();}

C、QColor

QT中使用QColor表示颜色,支持多种颜色的表示方法。

RGB:红、绿、蓝为基准的三色模型

HSV:色调、饱和度、明度为基准的六角锥体模型

CMYK:天蓝、品红、黄色、黑为基准的全彩印刷色彩模型

QColor支持在三种颜色模型间转换。

QColor color = dlg.selectedColor();qDebug() << color;
qDebug() << color.red();
qDebug() << color.green();
qDebug() << color.blue();
qDebug() << color.hue();
qDebug() << color.saturation();
qDebug() << color.value();

D、QColorDialog实用函数

QColorDialog定义了直接使用颜色对话框的静态成员函数。

QColor getColor(const QColor & initial, QWidget * parent, const QString & title, ColorDialogOptions options = 0)QColor getColor(const QColor & initial = Qt::white, QWidget * parent = 0)

5、输入对话框QInputDialog

QT中提供了预定义的输入对话框类QInputDialog,用于需要临时进行数据输入的场合。

输入对话框的使用方法如下:

A、创建输入对话框对象

 QInputDialog idialog(this);

B、输入对话框属性设置

    idialog.setWindowTitle("Enter Data");idialog.setLabelText("Please Enter a int:");idialog.setInputMode(QInputDialog::IntInput);if(idialog.exec() == QInputDialog::Accepted){qDebug() << idialog.intValue();}

C、输入对话框的输入模式

QInputDialog::TextInput 输入文本字符串

QInputDialog::IntInput 输入整型数

QInputDialog::DoubleInput 输入浮点数

D、QInputDialog的实用函数

QInputDialog定义了多个静态成员函数,直接调用使用输入对话框。

double getDouble(QWidget * parent, const QString & title, const QString & label,double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool * ok = 0, Qt::WindowFlags flags = 0)int getInt(QWidget * parent, const QString & title, const QString & label, int value = 0, int min = -2147483647, int max = 2147483647, int step= 1, bool * ok = 0, Qt::WindowFlags flags = 0)QString getItem(QWidget * parent, const QString & title, const QString & label, const QStringList & items, int current = 0, bool editable = true, bool *ok = 0, Qt::WindowFlags flags = 0)QString getText(QWidget * parent, const QString & title, const QString & label,QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0)

6、字体对话框QFontDialog

QT中提供了预定义的字体对话框类QFontDialog,用于提供选择字体的对话框部件。

字体对话框的使用方法如下:

A、创建字体对话框对象

QFontDialog fdialog(this);

B、字体对话框属性设置

    fdialog.setWindowTitle("Select Font");fdialog.setCurrentFont(QFont("Courier New", 10, QFont::Bold));if(fdialog.exec() == QFontDialog::Accepted){qDebug() << fdialog.selectedFont();}

C、QFontDialog实用函数

QFontDialog定义了静态成员函数,直接调用可以使用字体对话框选择字体。

QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const QString & title, FontDialogOptions options)QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const char * name)QFont getFont(bool * ok, QWidget * parent, const char * name)QFont getFont(bool * ok, const QFont & initial, QWidget * parent, const QString & title)QFont getFont(bool * ok, const QFont & initial, QWidget * parent = 0)QFont getFont(bool * ok, QWidget * parent = 0)

7、进度对话框QProgressDialog

QT提供了预定义的进度对话框类QProgressDialog,用于显示进度信息和需要用户等待的场合。

进度对话框的使用方法如下:

A、创建进度对话框对象

QProgressDialog pdialog(this);

B、进度对话框属性设置

    pdialog.setWindowTitle("Progress.....");pdialog.setLabelText("The application having done at ....");pdialog.setMaximum(100);pdialog.setMinimum(0);pdialog.setValue(30);pdialog.exec();

8、打印对话框QPrintDialog

QT中提供了预定义的打印对话框类QPrintDialog,用于设置打印相关的参数信息。

打印对话框的使用方法如下:

A、创建打印对话框对象

QPrintDialog prdialog(this);

B、打印对话框属性设置

    prdialog.setWindowTitle("Setting the Printer");if(prdialog.exec() == QPrintDialog::Accepted){QPrinter *p = prdialog.printer();QTextDocument td;td.setPlainText("Hello world!");p->setOutputFileName("d:\\hello.pdf");td.print(p);}

C、QPrinter类

QT中的QPrinter类是打印设备及其参数的封装,封装了系统中打印设备的驱动接口,以相同方式使用系统中的不同打印设备。

五、窗体之间数据的传递

QT窗体之间数据的传递有三种方式:信号槽机制、公有函数接口、全局变量。

1、QT信号槽传递

在发送数据的窗体类中定义带参数的信号,发送信号;在接收数据的窗体中定义接收数据的槽函数;将发送数据的信号和接收数据的槽函数连接。

声明信号:

signals:  void sendData(QString);   

发送信号(带参数内容):

emit sendData(lineEdit->text());

定义槽函数(带参数内容):

private slots:  void receiveData(QString data); 

连接信号与槽:

connect(sender,SIGNAL(sendData(QString)),receiver,SLOT(receiveData(QString)));

2、公有函数接口传递

使用公有成员函数接口可以在不同类外调用类的成员函数,返回需要的数据。

3、全局变量传递

全局变量可以在一个文件中定义,其他文件中声明后使用,实现数据的共享传递。

六、登录对话框实例

登录对话框是应用程序常用的部件。

1、登录对话框需求分析

登录对话框需求分析:

A、作为可复用的软件部件

B、获取用户名和密码

C、随机码验证

2、登录对话框的架构

登录对话框的设计和架构

对话框之间通过成员变量和成员函数传递数据,将用户数据保存在私有成员变量中,通过公有成员函数进行数据传递。

3、登录对话框类设计

#ifndef QLOGINDIALOG_H
#define QLOGINDIALOG_H#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>class QLoginDialog: public QDialog
{Q_OBJECT
private:QLabel UserLabel;QLabel PwdLabel;QLineEdit UserEdit;QLineEdit PwdEdit;QPushButton B_Login;QPushButton B_Cancel;QString m_user;QString m_pwd;
public:QLoginDialog(QWidget *parent);QString getUser();QString getPwd();~QLoginDialog();private slots:void Login();void Cancel();
};#endif // QLOGINDIALOG_H

实现文件:

#include "QLoginDialog.h"#include <QDebug>
#include <QMessageBox>QLoginDialog::QLoginDialog(QWidget *parent):QDialog(parent, Qt::WindowCloseButtonHint), UserLabel(this),PwdLabel(this),UserEdit(this), PwdEdit(this), B_Login(this),B_Cancel(this)
{UserLabel.setText("User ID:");UserLabel.move(50, 50);UserLabel.resize(60, 30);UserEdit.move(110, 50);UserEdit.resize(200, 30);PwdLabel.setText("Password:");PwdLabel.move(50, 100);PwdLabel.resize(60,30);PwdEdit.move(110, 100);PwdEdit.resize(200, 30);PwdEdit.setEchoMode(QLineEdit::Password);B_Login.setText("Login");B_Login.move(110, 150);B_Login.resize(80, 30);B_Cancel.setText("Cancel");B_Cancel.move(230, 150);B_Cancel.resize(80, 30);setWindowTitle("Login Window");setFixedSize(400, 300);connect(&B_Login, SIGNAL(clicked()), this, SLOT(Login()));connect(&B_Cancel, SIGNAL(clicked()), this, SLOT(Cancel()));
}QString QLoginDialog::getUser()
{return m_user;
}QString QLoginDialog::getPwd()
{return m_pwd;
}void QLoginDialog::Login()
{qDebug() << "login";m_user = UserEdit.text().trimmed();m_pwd = PwdEdit.text();if(!(m_user.isEmpty() || m_pwd.isEmpty())){done(Accepted);}else{QMessageBox mb(this);mb.setWindowTitle("Warning Message");mb.setIcon(QMessageBox ::Warning);mb.setText("User or PassWord can't empty! \nPlease check your username or password!");mb.setStandardButtons(QMessageBox::Ok);mb.exec();}
}void QLoginDialog::Cancel()
{qDebug() << "cancel";done(Rejected);
}QLoginDialog::~QLoginDialog()
{}

Hello Qt(十九)——QT对话框相关推荐

  1. 【正点原子Linux连载】 第十九章 CAN Bus 摘自【正点原子】I.MX6U嵌入式Qt开发指南V1.0.2

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 3)全套实验源码+手册+视频下载地址: ...

  2. OpenGL(十九)——Qt OpenGL波动纹理(旗子的飘动效果)

    OpenGL(十九)--Qt OpenGL波动纹理(旗子的飘动效果) 一.场景 在日常的项目中,我们经常会实现波动的一些纹理效果,比如飘动的旗子,水的波纹,地图上某一点的波浪圈圈等...,本篇介绍波动 ...

  3. QT开发(十)——QT输入组件

    QT开发(十)--QT输入组件 QT中有十三中输入组件,分别是下拉列表框QComboBox.字体下拉框QFontComboBox.行编辑框QLineEdit.文本编辑框QTextEdit.无格式文本编 ...

  4. Qt OpenGL(二十)——Qt OpenGL 核心模式版本

    Qt OpenGL(二十)--Qt OpenGL 核心模式版本 一.写在前面 在之前的OpenGL教程(1~19)中,采用的方式都是固定渲染管线,也就是OpenGL3.2版本之前的写法,但是OpenG ...

  5. FFmpeg开发(九)——Qt视频播放器之快进滑动条(参考了暴风影音、迅雷影音)

    FFmpeg开发(九)--Qt视频播放器之快进滑动条(参考了暴风影音.迅雷影音) 上一篇介绍了使用多线程 FFmpeg开发(八)--Qt视频播放器之多线程的使用(参考了暴风影音.迅雷影音) 本播放器系 ...

  6. QT入门第十天 QT安装和使用alsa库和jpeg库实现音视频录制

    QT入门第十天QT安装和使用alsa库和jpeg库实现音视频录制 第一章 ALSA库的移植和使用 1.ALSA简介 2.移植ALSA (1)移植步骤 3.把移植好的库下载到开发板配置 4.使用移植好的 ...

  7. QT开发(五十)——QT串口编程基础

    QT开发(五十)--QT串口编程基础 一.QtSerialPort简介 1.串口通信基础 目前使用最广泛的串口为DB9接口,适用于较近距离的通信.一般小于10米.DB9接口有9个针脚. 串口通信的主要 ...

  8. qtdesigner设计表格_实例9 利用Qt Designer设计一个对话框

    在Qt编程中,程序员通常都是使用手动编写Python源代码来进行Qt程序开发,但有些程序员也喜欢使用可视化的方法进行对话框设计,因此,Qt为习惯利用可视化方式进行窗口程序设计的程序员提供了Design ...

  9. QT中的模态对话框及非模态对话框

    模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其 ...

  10. Qt中的模态对话框和非模态对话框

    模态对话框及非模态对话框(详情见课本P51). 模态对话框:在没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭. 非模态对话框:当被打开时,用户既可选择和该对话框进行交互, ...

最新文章

  1. 下一跳网关和转发接口的使用情况
  2. VTK:Filtering之CombinePolyData
  3. java串口发送16进制数据_MFC串口通信发送16进制数据的方法
  4. Android百度云推送接入,附完整代码
  5. SQL 与 ORACLE 的比较
  6. python自动回复机器人手机版_GitHub - HZQHZA/wxpy: Python 写 微信聊天 根据 自动回复 接入机器人 等等.......
  7. libsvm2.89在matlab,libsvm-mat-2.89-3工具箱,方便实用
  8. 能在手机播放的Flash代码
  9. PyCharm汉化后无法打开Settings设置
  10. final cut pro x怎样导入3D LUT调色预设?
  11. python3 写入excel_python3读取、写入、追加写入excel文件
  12. 17个C语言可以做的小案例项目
  13. xposed微信长视频转发_微信万能转发模块xposed下载-微信万能转发模块最新版下载2.2.0-西西软件下载...
  14. 记录Linux开发板串口调试、静态ip
  15. Tomcat8出现To prevent a memory leak, the JDBC Driver has been forcibly unregistered
  16. 六级考研单词之路-三十
  17. 【Matlab】贝叶斯网络工具箱简介
  18. 北上资金全透视月报:上月外资大幅流入,增持周期与消费(20210107).PDF
  19. 干货来袭!腾讯T4大佬,十分钟教你用svg做出精美的动画
  20. Point-cloud based 3D object detection and classification methods for self-driving applications

热门文章

  1. 如何查询我的IP是不是原生IP?原生IP有什么作用?
  2. [BZOJ4826][HNOI2017]影魔(主席树)
  3. 计算机项目管理缩写,项目管理-常用缩写
  4. 微信公众号网页上点击放大图片浏览,解决方案
  5. 便宜的谷歌Android新EKEN M009平板电脑7寸无线摄像头重力感应
  6. 表空间main恢复后报脱机状态[-3408]
  7. 3d全景手机端导航菜单js特效
  8. android获取拍摄视频的gps,关于gps:Android获取当前位置的最佳方式
  9. 网页flv播放器JW FLV PLAYER 说明(转)
  10. vue+vant调取数字键盘