目录
1、新建项目对话框
2、非模态对话框
3、模态对话框
4、自定义对话框
5、Qt内置对话框
5.1 消息对话框QMessageBox
5.2 颜色对话框QColorDialog
5.3 文件对话框QFileDialog
5.4 字体对话框QFontDialog
5.5 输入对话框QInputDialog
结语
前言:
在Qt中,对话框是图形化界面不可缺少的一部分,他的类是QDialog。对话框的作用是让用户处理临时、简洁的任务,通常让用户进行一些选择。对话框本质也是一个独立的窗口,他分为两类:1、模态对话框,2、非模态对话框。Qt中内置一些可以直接用的对话框,常用的有以下几种:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog (字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框)。当然还允许开发者继承QDialog类实现自定义对话框。
1、新建项目对话框
在Qt Creator中,可以在新建项目中选择新建QDialog类,如下图:
新建完成后,运行程序可以得到一个界面,该界面的右上角有一个问号,表示该界面是对话框的基础界面:
但是以上新建QDialog项目的做法是没有意义的,因为实际运用中对话框是以子窗口的身份出现在程序中的,往往是在主窗口中执行了某种逻辑,这时候才会跳出对话框,而上述将对话框作为主窗口则体现不出对话框的作用。因此下文的例子是在主窗口QMainWindow中通过new的形式,创建一个QDialog对象作为子窗口。
2、非模态对话框
非模态对话框是一种模式,表示对话框创建出来时不会限制用户对主窗口的操作,通俗来说,用户可以在对话框和主窗口之间进行切换,将这种模式称为非阻塞对话框。调用QDialog里的show()函数实现非模态对话框。
实现一个按钮,只要该按钮被按下,则就会创建一个新的对话框,在QMainWindow.cpp实现代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//创建对话框
QDialog* dialog = new QDialog(this);
//采用非模态
dialog->show();
}
运行结果:
可以看到能够正常创建对话框,但是上述代码有一个问题:如果关闭了对话框,是不会自动释放该对话框对象的,如果在一个主窗口中点击了多次按钮,就会一直创建新的对话框对象,从而导致内存泄漏。解决方法是设置 Qt:WA_DeleteOnClose 属性,写法如下:
void MainWindow::on_pushButton_clicked()
{
//创建对话框
QDialog* dialog = new QDialog(this);
//采用非模态
dialog->show();
//效果为:关闭对话框时自动调用delete进行释放
dialog->setAttribute(Qt::WA_DeleteOnClose);
}
3、模态对话框
模态对话框表示弹出对话框时,用户只能在该对话框里进行操作,无法在该对话框存在的情况下去操作主窗口。使用模态对话框非常简单,将上述的show方法改成exec方法即可,代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//创建对话框
QDialog* dialog = new QDialog(this);
//采用模态
dialog->exec();
//关闭对话框时自动调用delete进行释放
dialog->setAttribute(Qt::WA_DeleteOnClose);
}
运行结果:
4、自定义对话框
上述例子中的对话框仅仅只是一个窗口,无法添加任何控件,而一个完整的对话框是要有自己的控件的,这样才能与用户进行交互,若要实现在对话框中加入控件,方法之一就是自定义一个继承QDialog的类,然后在该类的构造函数中new出控件即可完成添加。步骤如下:
新建完成后,会自动生成如下文件和代码:
现在只需要在对应的文件中添加相关代码即可,dialog.h代码如下:
#ifndef DIALOG_H
#define DIALOG_H
#include <QWidget>
#include <QDialog>
class dialog : public QDialog
{
Q_OBJECT
public:
dialog(QWidget* parent);
};
#endif // DIALOG_H
dialog.cpp代码如下:
#include "dialog.h"
#include <QPushButton>
#include <QLabel>
dialog::dialog(QWidget* parent):QDialog(parent)
{
QLabel* label = new QLabel("对话框标签",this);
QPushButton* pushbutton = new QPushButton("对话框按钮",this);
pushbutton->move(200,200);
}
mainwindow.cpp代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
dialog* di = new dialog(this);
di->show();
di->setAttribute(Qt::WA_DeleteOnClose);
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
5、Qt内置对话框
Qt内部提供了多种对话框类型,即Qt标准对话框,这些对话框的框架都已经设置好了,可以直接使用。Qt标准对话框全部继承自QDialog类,在QDialog的基础上进行功能添加,就如同一个自定义对话框,只不过他们的功能更加丰富。标准对话框如下图所示:
注意:Qt内置对话框默认都具有模态性质的,即不需要调用exec函数就具有模态性质,同时也可以具有非模态的创建和销毁机制。
5.1 消息对话框QMessageBox
QMessageBox是图形化界面中常用的对话框,主要用于给用户展示某些信息,并强制用户进行选择操作。QMessageBox类中提供了setIcon()函数,该函数的作用是更改消息对话框的类型,通过传入QMessageBox提供的枚举类型来进行风格设置,有以下四种枚举对应四种风格:
Question
|
用于正常操作过程中的提问
|
Information
|
用于报告正常运⾏信息
|
Warning
|
用于报告⾮关键错误
|
Critical
|
用于报告严重错误
|
测试代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建消息对话框
QMessageBox* mes = new QMessageBox(this);
//设置对话框标题
mes->setWindowTitle("提示信息");
//设置对话框的文本内容
mes->setText("是否执行");
//设置对话框类型
mes->setIcon(QMessageBox::Information);
//设置对话框的按钮
mes->setStandardButtons(QMessageBox::Yes|QMessageBox::No);
mes->show();//即使用show,这该对话框也是具有模态性质
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
从上述可以得知,消息对话框的框架是建立好了的,我们的工作就是对其风格进行设置。
上述代码逻辑可以简化成一句代码,该代码如下:
QMessageBox::information(this,"提示信息","是否执行",QMessageBox::Yes|QMessageBox::No);
这句代码的实现和上述代码的实现是一样的,只不过这种写法无法更改对话框中的细节,灵活度不够高。
5.2 颜色对话框QColorDialog
颜色对话框的作用就是让开发者在该对话框中选择一种颜色,然后拿到该颜色的RGB值,因为在程序中,颜色都是以数值的方式表现的,所以要想在代码中进行上色,必须使用RGB值,而开发者无法记住每一个RGB值代表什么颜色,因此需要一个颜色展示框(颜色对话框)来供开发者选择。
QColorDialog常用接口介绍如下:
//该接口的作用是打开颜⾊选择对话框,并返回⼀个QColor对象,该对象保存RGB值
QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr,
const QString&title = QString(),
QColorDialog::ColorDialogOptions options = ColorDialogOptions())
//initial 表示给该颜色对话框设置一个初始的RGB
//parent 设置父对象
//title 设置对话框标题
//options 设置选项
QColorDialog测试代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QDebug>
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个按钮
QPushButton* push = new QPushButton("按钮",this);
//创建颜色对话框
QColorDialog* color = new QColorDialog(this);
//打开颜色对话框并获取到RGB值,该值存放在QColor的对象里,还可以设置对话框标题
QColor c = color->getColor(QColor(0,255,0),this,"我们的颜色对话框");
qDebug()<<c;
//使用获取到的RGB值来设置按钮的颜色
push->setStyleSheet("background-color:rgb("+ QString::number(c.red())
+','+QString::number(c.green())+','+QString::number(c.blue())+");");
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
可以发现按钮的背景颜色变成了绿色,但是打印信息并不是0,255,0,这是因为打印的方式是ARGB(A表示不透明度,意思是将RGB的值采用透明度的方式来展现),其中1表示完全不透明度,后面是以三个小数来表示RGB的值,其中1就对应到RBG的255,0对应到RBG的0。
5.3 文件对话框QFileDialog
⽂件对话框用于界面中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件中。打开文件的接口介绍如下:
//该接口打开一个文件并返回该文件的路径
QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(),
constQString &dir = QString(), const QString &filter = QString(),
QString *selectedFilter = nullptr,QFileDialog::Options options = Options())
//parent 表示父对象
//caption 表示对话框标题
//dir 表示要打开的路径
//filter 表示文件过滤器
测试代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置一个按钮,点击该按钮就跳出文件对话框
QPushButton* push = new QPushButton("打开文件",this);
//创建一个文件对话框对象
QFileDialog* file = new QFileDialog(this);
//用lambda来实现槽函数
connect(push,&QPushButton::clicked,this,[=](){
QString s = file->getOpenFileName(this);
qDebug()<<s;
});
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
getOpenFileName不仅可以打开文件对话框,还可以返回选择文件的路径。
保存文件用的函数是getSaveFileName,他的用法和打开文件是一样的,代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置一个按钮,点击该按钮就跳出文件对话框
QPushButton* push = new QPushButton("保存文件",this);
//创建一个文件对话框对象
QFileDialog* file = new QFileDialog(this);
//用lambda来实现槽函数
connect(push,&QPushButton::clicked,this,[=](){
QString s = file->getSaveFileName(this);
qDebug()<<s;
});
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
5.4 字体对话框QFontDialog
字体对话框的使用逻辑和颜色对话框有效相似,都是为了让开发者能够清楚的选择某些选项,然后将这些选项保存在一个对象中,供后续的使用。常用接口介绍如下:
static QFont getFont(bool *ok, const QFont &initial,
QWidget *parent = nullptr,
const QString &title = QString(),
FontDialogOptions options = FontDialogOptions());
//ok 表示对话框是否完成设置
//initial 表示设置对话框的默认值
//parent 表示对话框的父对象
//title 表示对话框标题
//options 表示对话框选项
测试代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFontDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个文本对话框
QFontDialog* font = new QFontDialog(this);
//打开文本对话框,并设置默认值
bool ok;
QFont f = font->getFont(&ok,QFont("楷书",22),this);
//打印f
qDebug()<<ok;
qDebug()<<f.family();//字体
qDebug()<<f.pointSize();//字号
qDebug()<<f.bold();//加粗
qDebug()<<f.italic();//倾斜
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
5.5 输入对话框QInputDialog
输入对话框就是让用户输入一些简单的数值,比如整形数据、浮点型数据,常用的输入对话框类型有以下几种:
1、双精度浮点型输⼊数据对话框-调用getDouble函数
2、整型输⼊数据对话框-调用getInt函数
3、条⽬型输⼊对话框-调用getItem函数
以上的函数参数用法和之前的逻辑都相差不差,只要看下面代码例子就知道如何使用了。
测试双精度浮点型对话框:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QInputDialog* input = new QInputDialog(this);
double tmp = input->getDouble(this,"双精度输入框","请选择一个数值",10);
qDebug()<<tmp;
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
可以点击右边的上下按钮对数值进行调整,也可以直接在输入框中自定义数值。
整型对话框的逻辑和双精度浮点型对话框代码逻辑是一样的,只需要将函数更改为getInt就行,这里主要测试条目型输⼊对话框,这个对话框是选择字符串的,测试代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QInputDialog* input = new QInputDialog(this);
//创建条目
QStringList tmp;
tmp<<tr("苹果")<<tr("香蕉")<<("西瓜");
QString s = input->getItem(this,"整形输入框","请选择一个数值",tmp);
qDebug()<<s;
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
结语
以上就是关于对话框QDialog的介绍,对话框作为图形化界面常用的控件之一,自然是非常重要的,这一点可以在实际使用中感受得到。主要掌握内置对话框尤为重要,因为内置对话框的使用场景较多,并且其已经是成品了所以用起来也方便。
最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!