当前位置: 首页 > news >正文

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

  1. 以代码方式:
// 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;
}

效果:

在这里插入图片描述

  1. 以图形化方式:

以图形化界面的方式自定义对话框,关键是要新建一个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,就可以指将创建出类型为inforomationMessageBox。类似的还有:

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;});
}

效果:

在这里插入图片描述

http://www.dtcms.com/a/337466.html

相关文章:

  • 51c大模型~合集170
  • Codeforces I Will Definitely Make It
  • 构建情感智能体:下一代AI心理助手的架构与实践
  • 折扣大牌点餐api接口对接适合本地生活吗?
  • QT中同时兼任VS2019和VS2022套件
  • 企业级大模型微调指南:数据准备、参数调优与部署优化全流程
  • 从0-1使用Fastmcp开发一个MCP服务,并部署到阿里云百炼 -持续更新中
  • 大数据服务完全分布式部署- 其他组件(阿里云版)
  • 数字隔离器,变频器安全运行的 “隐形引擎”
  • 深入对比:Chromium的base::RefCounted与std::shared_ptr——从线程安全到性能优化
  • 宏观认识 Unitree LiDAR L1 及其在自动驾驶中的应用
  • Avalonia实例实战七:动画
  • win环境断电强制拉库报ORA-600 kcbzib_kcrsds_1故障处理---惜分飞
  • 数据库:表和索引结构
  • 【datawhale组队学习】n8n TASK01
  • 知识蒸馏 Jensen-Shannon散度
  • 为什么品牌更愿意为新品打广告?
  • 机器学习——XGBoost算法
  • 力扣2道dp
  • easyexcel fastexcel 官方文档 easyexcel合并单元格
  • 项目会议怎么开才有效
  • 【前端面试题】JavaScript 核心知识点解析(第十四题解析到第二十二题)
  • 【Mac】【Minecraft】关于如何在Mac上搭建基岩版MC服务器的方法
  • 前端Element-plus的选择器 el-select 清空内容时,后端对应的更新方式,支持更新为null
  • 【秋招笔试】2025.08.09网易秋招机考
  • openEuler系统备份与恢复方法
  • 【DL学习笔记】交叉熵损失函数详解
  • 无人机视角违章建筑识别分割数据集labelme格式343张2类别
  • AI测试自愈率80%!语音编程提效10倍——2025软件AI化爆炸级突破
  • 端面试题大汇总二