Qt——对话框 QDialog
对话框 QDialog


对话框问问用于和用户之间进行”短平快“的操作
内置的对话框有:
- QFiledialog(文件对话框)
- QColorDialog(颜色对话框)
- QFontDialog(字体对话框)
- QInputDialog(输入对话框
- QMessageBox(消息框)
可以在创建项目的时候,直接创建一个对话框:

实际开发中,更多情况,往往不是直接在创建项目的时候继承自QDialog,而是在代码中创建一个类,继承自QDialog:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){QDialog* log = new QDialog(this);log->setWindowTitle("这是一个对话框");log->setGeometry(500, 500, 300, 300);log->show();delete log; // 对话框关闭,就要释放对话框内存,防止内存泄露});
}
- 注意:上述代码存在问题,如果在
log->show();之后直接进行delete log;,就会导致对话框只展示一瞬间,就自己销毁了
效果:

正确的写法应该是这样:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){QDialog* log = new QDialog(this);log->setWindowTitle("这是一个对话框");log->setGeometry(500, 500, 300, 300);log->setAttribute(Qt::WA_DeleteOnClose);log->show();});
}
log->setAttribute(Qt::WA_DeleteOnClose);:设置对话框属性为:关闭时自动释放内存
自定义对话框,新建一个类Dialog,继承自QDialog:
- 以代码方式:
// dialog.cpp
#include "dialog.h"#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>Dialog::Dialog(QWidget* parent): QDialog(parent)
{QVBoxLayout* layout = new QVBoxLayout();QPushButton* button = new QPushButton("按钮");QLabel* label = new QLabel("这是一条文本");layout->addWidget(button);layout->addWidget(label);this->setLayout(layout);
}// mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"#include <QPushButton>
#include "dialog.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){Dialog* log = new Dialog(this);log->setWindowTitle("这是一个对话框");log->setGeometry(500, 500, 300, 300);log->setAttribute(Qt::WA_DeleteOnClose);log->show();});
}MainWindow::~MainWindow()
{delete ui;
}
效果:

- 以图形化方式:
以图形化界面的方式自定义对话框,关键是要新建一个ui文件和对应的类,步骤如下:

创建完成后,就会获得一个类Dialog和一个新的ui文件dialog.h。可以编辑这两个文件来达到自定义对话框的效果:
// dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_pushButton_clicked()
{this->close();
}// mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"#include "dialog.h"
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){Dialog* log = new Dialog(this);log->setWindowTitle("这是一个对话框");log->setGeometry(500, 500, 300, 300);log->setAttribute(Qt::WA_DeleteOnClose);log->show();});
}MainWindow::~MainWindow()
{delete ui;
}
效果:

模态 model
对话框还有一个重要的属性——模态 model
- 模态:弹出对话框的时候,此时用户无法操作父窗口。直到对话框关闭。此状态一般用于很重要关键的场景。
- 非模态:弹出对话框的时候,用户还可以操作父窗口。例如上面的例子都是非模态的
可以将show()方法替换成exec()方法,使对话框成为模态对话框:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){Dialog* log = new Dialog(this);log->setWindowTitle("这是一个对话框");log->setGeometry(500, 500, 300, 300);log->setAttribute(Qt::WA_DeleteOnClose);log->exec();});
}
效果:

MessageBox
显示一个消息给用户,并让用户进行选择
其内部定义了很多枚举类型,这样我们可以很方便的对MessageBox的图标、按钮等属性进行设置,例如:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){QMessageBox* messageBox = new QMessageBox();messageBox->setWindowTitle("警告"); // 设置标题messageBox->setText("警告:xxxxxxxx"); // 设置文本messageBox->setIcon(QMessageBox::Icon::Warning); // 设置内置的图标messageBox->setStandardButtons(QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::Cancel); // 设置内置按钮messageBox->exec();delete messageBox;});
}
效果:

同时,我们也可以添加自定义按钮:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){QMessageBox* messageBox = new QMessageBox();messageBox->setWindowTitle("警告"); // 设置标题messageBox->setText("警告:xxxxxxxx"); // 设置文本messageBox->setIcon(QMessageBox::Icon::Warning); // 设置内置的图标messageBox->setStandardButtons(QMessageBox::StandardButton::Ok); // 设置内置按钮// 添加自定义按钮QPushButton* button = new QPushButton("Cancel");messageBox->addButton(button, QMessageBox::RejectRole);messageBox->exec();delete messageBox;});
}
方法addButton()有三种重载:
void addButton(QAbstractButton *button, QMessageBox::ButtonRole role)QPushButton *addButton(const QString &text, QMessageBox::ButtonRole role)QPushButton *addButton(QMessageBox::StandardButton button)
这里主要说明参数:QMessageBox::ButtonRole role
这个枚举类型描述了这个按钮承担了什么样的角色,可以通过或运算
|表示当点击这个按钮时触发的动作的类型
上面的QMessageBox::RejectRole,就表示这个按钮出发的类型是拒绝
如果想要实现:当用户点击完MessageBox自带的按钮后,自动执行其他操作,就需要引入信号槽功能,但是对于其自带的按钮,实现信号槽是很困难的。
此时我们可以使用exec()的返回值,进行处理:
如果用户点击的是一个标准按钮(
MessageButton自带的) 那么exec()的**返回值就是一个****StandardButton**枚举类型,即用户点的按钮类型如果点击的是一个自定义按钮,
exec()的返回值不确定,此时**需要使用调用****clickedButton()**来确定点击的按钮
例如:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this](){QMessageBox* messageBox = new QMessageBox();messageBox->setWindowTitle("警告"); // 设置标题messageBox->setText("警告:xxxxxxxx"); // 设置文本messageBox->setIcon(QMessageBox::Icon::Warning); // 设置内置的图标messageBox->setStandardButtons(QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::Cancel); // 设置内置按钮// 添加自定义按钮QPushButton* button = new QPushButton("None");messageBox->addButton(button, QMessageBox::RejectRole);int res = messageBox->exec();if (res == QMessageBox::StandardButton::Ok) {qDebug() << "OK";} else if (res == QMessageBox::StandardButton::Cancel) {qDebug() << "Cancel";} else if (button == messageBox->clickedButton()) {qDebug() << "None";}delete messageBox;});
}
如果使用MessageBox时,不需要自定义按钮,那么还有更简便的方式来创建出一个MessageBox:
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QPushButton* button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this]() {int res = QMessageBox::information(this, "提示", "这是一段提示",QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::Cancel);if (res == QMessageBox::StandardButton::Ok) {qDebug() << "OK";} else if (res == QMessageBox::StandardButton::Cancel) {qDebug() << "Cancel";}});
}
使用QMessageBox::information,就可以指将创建出类型为inforomation的MessageBox。类似的还有:
QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &text,QMessageBox::StandardButtons buttons = Ok,QMessageBox::StandardButton defaultButton = NoButton);QMessageBox::StandardButton information(QWidget *parent, const QString &title, const QString &text,QMessageBox::StandardButtons buttons = Ok,QMessageBox::StandardButton defaultButton = NoButton);QMessageBox::StandardButton question(QWidget *parent, const QString &title, const QString &text,QMessageBox::StandardButtons buttons = StandardButtons(Yes |No),QMessageBox::StandardButton defaultButton = NoButton);QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text,QMessageBox::StandardButtons buttons = Ok,QMessageBox::StandardButton defaultButton = NoButton);
颜色对话框 ColorDialog
Qt内置的调色板
常用方法:
QColorDialog (QWidget *parent = nullptr) // 创建对象的同时设置父对象QColorDialog (const QColor &initial, QWidget *parent = nullptr) // 创建对象的同时通过 QColor 对象设置默认颜色和父对象void setCurrentColor (const QColor &color) // 设置当前颜色对话框QColor currentColor () const // 获取当前颜色对话框// 打开颜色选择对话框,并返回一个 QColor 对象
// 静态函数
QColor getColor (const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString (), QColorDialog::ColorDialogOptions options = ColorDialogOptions ())
使用实例:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QPushButton *button1 = new QPushButton("点击生成一个对话框", this);button1->setGeometry(200, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this, button1]() {QColor color = QColorDialog::getColor(QColor(255, 200, 255), this, "颜色选择器");char set_color[1024]{0};sprintf(set_color, "background-color:rgb(%d, %d, %d)", color.red(), color.green(),color.blue());button1->setStyleSheet(set_color);});
}
效果:

文件对话框 FileDialog
通过该类型对话框,可以选择一个文件,并获得该文件的一个路径。用于打开或保存文件
常用静态方法:
// 打开文件
QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(),const QString &dir = QString(), const QString &filter = QString(),QString *selectedFilter = nullptr,QFileDialog::Options options = Options());// 保存文件
QString getSaveFileName(QWidget *parent = nullptr, const QString &caption = QString(),const QString &dir = QString(), const QString &filter = QString(),QString *selectedFilter = nullptr,QFileDialog::Options options = Options());
使用实例:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QPushButton *button1 = new QPushButton("打开文件", this);button1->setGeometry(200, 200, 150, 150);QPushButton *button2 = new QPushButton("保存文件", this);button2->setGeometry(400, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this]() {QString path = QFileDialog::getOpenFileName(this);qDebug() << path;});connect(button2, &QPushButton::clicked, this, [this]() {QString path = QFileDialog::getSaveFileName(this);qDebug() << path;});
}
- 需要注意,这里的保存和打开文件,只是获取到文件的路径,不是真的保存或者打开了
效果:

字体对话框 FontDialog
常用静态方法:
QFont QFontDialog::getFont(bool *ok, const QFont &initial, QWidget *parent = nullptr, const QString &title = QString(), QFontDialog::FontDialogOptions options = FontDialogOptions())
ok:输出型参数,如果用户点击对话框的OK,则为true;如果选择Cancel,则为false
例如:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QPushButton *button1 = new QPushButton("点击,生成一个字体选择器", this);button1->setGeometry(200, 200, 200, 150);connect(button1, &QPushButton::clicked, this, [this, button1]() {bool ok = false;QFont font = QFontDialog::getFont(&ok, this);if (ok) {button1->setFont(font);}});
}
效果:

输入对话框 InputDialog
常用的静态方法:
// 浮点数
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(), double step = 1);// 整数
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());// 字符串
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);
使用实例:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QPushButton *button1 = new QPushButton("浮点对话框", this);button1->setGeometry(100, 200, 150, 150);QPushButton *button2 = new QPushButton("整形对话框", this);button2->setGeometry(300, 200, 150, 150);QPushButton *button3 = new QPushButton("条目对话框", this);button3->setGeometry(500, 200, 150, 150);connect(button1, &QPushButton::clicked, this, [this]() {double val = QInputDialog::getDouble(this, "浮点对话框", "请输入一个浮点数");qDebug() << val;});connect(button2, &QPushButton::clicked, this, [this]() {int val = QInputDialog::getInt(this, "整形对话框", "请输入一个整数");qDebug() << val;});connect(button3, &QPushButton::clicked, this, [this]() {QString item = QInputDialog::getItem(this, "条目对话框", "请输入或选择一个条目",{"111", "222", "333"});qDebug() << item;});
}
效果:

