[Qt] 窗口 | QDialog | 常用内置对话框
目录
1、对话框介绍
2、对话框的分类
3、Qt 内置对话框
(1)消息对话框 QMessageBox
(2)颜色对话框 QColorDialog
(3)文件对话框 QFileDialog
(4)字体对话框 QFontDialog
(5)输入对话框 QInputDialog
1、对话框介绍
对话框是 GUI 程序中不可或缺的组成部分。
- 一些不适合在主窗口实现的功能组件可以设置在对话框中。
- 对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁(“短平快”)的用户交互。
Qt 常用的内置对话框有:
QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog (字体对话框)、QInputDialog (输入对话框)和 QMessageBox(消息框) 。
2、对话框的分类
对话框分为 模态对话框 和 非模态对话框 。
(1)模态对话框
模态对话框 指的是:显示后无法与父窗口进行交互,是⼀种阻塞式的对话框。使用 QDialog:: exec () 函数调用。
模态对话框适用于必须依赖用户选择的场合,比如消息显示、文件选择、打印设置等。
示例:
- A. 新建 Qt 项目,在 ui 文件中的菜单栏中设置两个菜单:“文件” 和 “编辑”,在菜单 “文件” 下新建菜单项:“创建” 并将菜单项 “新建” 置于工具栏中。
- B. 在 mainwindow.cpp 文件中实现:当点击 “新建” 时,弹出一个模态对话框
说明:在菜单项中,点击菜单项时就会触发 triggered() 信号。
(2)非模态对话框
非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用 QDialog::show() 函数调用。
- 非模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的非模态对话框就会一闪而过。
- 我们需要将 delete 和关闭按钮的点击信号关联起来,在用户点击关闭时触发 delete,Qt 为了让咱们写的方便, 直接给 QDialog 设置了一个属性, 可以通过设置属性, 完成上述效果: Qt:WA_DeleteOnClose 属性(WAC)
- 目的是:当创建多个非模态对话框时(如打开了多个非模态窗口),为了避免内存泄漏要设置此属性。
非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等。
示例:
(3)混合属性对话框
混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框的属性。
使用 QDialog::setModal() 函数可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的父组件。
示例:
3、自定义对话框
(1)通过代码的方式
dialog.cpp
Dialog::Dialog(QWidget* parent) : QDialog(parent)
{
// 创建出一些控件, 加入到 Dialog 中. (以 Dialog 作为父窗口)
QVBoxLayout* layout = new QVBoxLayout();
this->setLayout(layout);
QLabel* label = new QLabel("这是一个对话框", this);
QPushButton* button = new QPushButton("关闭", this);
layout->addWidget(label);
layout->addWidget(button);
connect(button, &QPushButton::clicked, this, &Dialog::handle);
}
void Dialog::handle()
{
this->close();
}
mainwin.cpp
void MainWindow::on_pushButton_clicked()
{
Dialog* dialog = new Dialog(this);
dialog->resize(400, 300);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
}
展示效果:
(2)通过图形化界面的方式
新增一个 ui 文件:
选择 dialog.ui,创建一个 Push Button 和一个 Label,效果图如上一个例子
3、Qt 内置对话框
Qt 提供了多种可复用的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常用标准对话框如下:
(1)消息对话框 QMessageBox
消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。
QMessageBox 类中定义了静态成员函数,可以直接调用创建不同风格的消息对话框,其中包括:
其对应的函数原型如下:
实现一个警告提示信息对话框:
void MainWindow::on_pushButton_clicked()
{
// 创建 QMessageBox
QMessageBox* messageBox = new QMessageBox(this);
messageBox->setWindowTitle("对话框窗口标题");
messageBox->setText("这是对话框的文本");
messageBox->setIcon(QMessageBox::Warning);
// 标准按钮中, 根本就没法进行信号槽的连接. (按钮是 QMessageBox 自己生成的)
messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);
// QPushButton* button = new QPushButton("按钮", messageBox);
// messageBox->addButton(button, QMessageBox::AcceptRole);
// connect 连接信号槽, 来针对当前点击的按钮进行一些相关操作.
// 非模态的弹框. QMessageBox 使用场景更多的是模态的.
// messageBox->show();
// 弹出模态对话框, 当对话框处于弹出状态的时候, 代码就会在 exec 这里阻塞. 一直到对话框被关闭.
// 用户点击按钮, 使对话框关闭之后, 此时就能通过 exec 的返回值, 来知道用户点击的是哪个按钮, 从而执行一些对应的逻辑了.
int result = messageBox->exec();
if (result == QMessageBox::Ok) {
qDebug() << "OK";
} else if (result == QMessageBox::Save) {
qDebug() << "Save";
} else if (result == QMessageBox::Cancel) {
qDebug() << "Cancel";
}
// delete messageBox;
messageBox->setAttribute(Qt::WA_DeleteOnClose);
}
实现效果如下:
其中可以设置的按钮的类型如下:
更改消息对话框中的按钮类型:
类似的,问题(Question)/ 信息(Information)/ 错误(Critical)提示对话框效果图如下:
......
(2)颜色对话框 QColorDialog
Qt QColorDialog 的功能就是内置了调色板,效果和下面看到的画图板的调色板非常类似。
颜色对话框的功能是允许用户选择颜色。继承自 QDialog 类。颜色对话框如下图示:
常用方法介绍:
A. 创建对象的同时设置父对象
- QColorDialog (QWidget *parent = nullptr)
B. 创建对象的同时通过 QColor 对象设置默认颜色和父对象
- QColorDialog(const QColor &initial, QWidget *parent = nullptr)
C. 设置当前颜色对话框
- void setCurrentColor(const QColor &color)
D. 获取当前颜色对话框
- QColor currentColor() const
E. 打开颜色,选择对话框,并返回一个QColor对象
- QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())
参数说明:
- initial:设置默认颜色
- parent:设置父对象
- title:设置对话框标题
- options:设置选项
F. 打开颜色对话框
- void open(QObject *receiver, const char *member)
修改窗口的背景色
void MainWindow::on_pushButton_clicked()
{
// QColorDialog* dialog = new QColorDialog(this);
// dialog->exec();
// delete dialog;
// 函数的返回值就是用户选择的颜色.
QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");
qDebug() << color;
// 可以基于用户选择的颜色, 修改窗口的背景色.
// 可以通过 QSS 的方式设置背景色.
// QString style = "background-color: rgb(" + QString::number(color.red()) + ", " + QString::number(color.green())
// + ", " + QString::number(color.blue()) + ");";
char style[1024] = { 0 };
sprintf(style, "background-color: rgb(%d, %d, %d);", color.red(), color.green(), color.blue());
this->setStyleSheet(style);
}
效果如下:
⭕ sprintf: 格式化 _ 输出
(3)文件对话框 QFileDialog
文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容 存 储到指定的外部文件。
常用方法介绍:
A. 打开文件(一次只能打开一个文件)
- QString getOpenFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
B. 打开多个文件(一次可以打开多个文件)
- QStringList getOpenFileNames (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
C. 保存文件
- QString getSaveFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
参数说明:
- 参数 1:parent 父亲
- 参数 2:caption 对话框标题
- 参数 3:dir 默认打开的路径
- 参数 4:filter 文件过滤器
【打开和保存文件】
这里的打开 / 保存功能都是需要额外去实现的,并不是说按了打开 / 保存就真的打开 / 保存了。
运行效果:
(4)字体对话框 QFontDialog
Qt 中提供了预定义的字体对话框类 QFontDialog,用于提供选择字体的对话框部件。
示例:
运行效果如下:
(5)输入对话框 QInputDialog
Qt 中提供了预定义的输入对话框类:QInputDialog,用于进行临时数据输入的场合。
常⽤方法介绍:
A. 双精度浮点型输⼊数据对话框
- double getDouble (QWidget *parent, const QString &title, const QString &label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
B. 整型输⼊数据对话框
- int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
C. 选择条目型输入数据框
- QString getItem (QWidget *parent, const QString &title, const QString &label, const QStringList &items, int current = 0, bool editable = true, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone) ;
参数说明:
- parent:父亲
- title:对话框标题
- label:对话框标签
- items:可供选择的条目
测试:
运行: