目录
1.对话框介绍:
- 在 Qt 中,对话框(Dialog)用于与用户进行交互。
- 对话框在应用程序中有多种用途,如显示消息、获取用户输入、进行设置等。
- 它通常是一个顶层窗口,出现在程序最上面,用于实现短期的任务或者简洁的用户交互。
- 通过QDialog类创建对话框。在创建项目时,选择基类为QDialog。
- 一般情况下不会在创建项目时直接创建为对话框,而是在主窗口实现一个类,来继承对话框,从而使用。
2.对话框的一些使用方法:
- 创建对话框对象:QDialog* dialog=new QDialog(this);
- 弹出对话框:dialog->show();
- 设置对话框属性:dialog->resize(400,300);单位是像素
- 设置对话框的标题:dialog->setWindowTitle("这是对话框的标题");
3.对话框内存泄漏问题/释放对话框资源:
- 如果使用new的方法创建对话框,每次创建的对话框都会被挂在对象树上。
- 如果一个按钮实现了弹出对话框这个功能,我们一直点击按钮,就会一直创建新的对话框对象。这些对话框都被挂在对象树上,如果不人工干预进行释放,迟早会导致内存泄漏。
- 我们需要将对话框的关闭按钮和delete释放对话框进行绑定。
- 通过:dialog->setAttribute(Qt::WA_DeleteOnClose);这个方法,可以实现释放对话框资源的功能。
4.代码方式创建自定义对话框:
- 要想对对话框进行自定义操作,比如添加控件等,就需要继承QDialog类。
- 首先创建一个C++类
- 填写类名,指定继承的父类。
- 因为以下bug
- 因为一些bug,我们需要手动在新建的头文件包含父类的头文件。
- 如果要将自定义的对话框挂在对象树上,就需要修改一下自定义类型的构造函数的声明和定义。
- 通过主窗口的一个按钮绑定一个槽函数,来弹出窗口。
void MainWindow::on_pushButton_clicked() { dialog* dialog_1=new dialog(this); //设置对话框大小 dialog_1->resize(400,300); //设置窗口标题 dialog_1->setWindowTitle("这是窗口的标题"); //弹出窗口 dialog_1->show(); //设置关闭按钮能释放对话框资源 dialog_1->setAttribute(Qt::WA_DeleteOnClose); }
- 自定义窗口的样式。
dialog::dialog(QWidget* parent):QDialog(parent) { //创建两个按钮 QPushButton* button_1=new QPushButton("这是按钮1",this); QPushButton* button_2=new QPushButton("这是按钮2",this); //创建一个布局管理器 QVBoxLayout* layout=new QVBoxLayout(); this->setLayout(layout); //将两个按钮添加到布局管理器 layout->addWidget(button_1); layout->addWidget(button_2); }
- 最终效果展示:
5.图形化界面创建自定义对话框:
- 先创建一个如下文件:
- 创建完成后,会自动生成三个文件。
- 我们可以直接在ui界面进行编辑,自定义对话框类。
- 此时通过dialog类创建的对象,会自动调用新的ui界面。
6.对话框的模态和非模态:
- modality属性,用于控制用户在对对话框操作时,是否可以操作父窗口。
- 模态:用户在操作对话框时,不能操作父窗口,必须要完成决策关闭对话框之后,才能操作父窗口。
- 非模态:用户在操作对话框时,可以操作父窗口。
- 默认情况下,创建的对话框为非模态对话框,即能在弹出对话框后继续操作父窗口。
- 如何将一个对话框改为模态对话框呢?只需将弹出时的show()方法,改为exec()方法即可。
- 模态对话框还是尽量少用,会影响用户体验。
7.对话框分类:
QMessageBox-消息框:
用于显示简单的消息、警告、错误和询问用户确认。
提供几种标准按钮(如 OK、Cancel、Yes、No)。
QFileDialog-文件对话框:
用于打开和保存文件。
提供文件系统的浏览界面。
- QColorDialog-颜色对话框:
用于选择颜色。
提供颜色选择器界面。
QFontDialog-字体对话框:
用于选择字体。
提供字体选择界面。
- QFontDialog-字体对话框:
用于选择字体。
提供字体选择界面。
8.QMessageBox-消息对话框:
- 向用户显示信息、警告、错误以及询问确认。
- 通过QMessageBox类创建消息对话框对象。
- setWindowTitle:设置对话框标题。
- setIcon(QMessageBox::Warning):设置对话框的图标(如信息、警告、错误等)。
- setText:设置对话框的主要文本内容。
- setInformativeText:设置对话框的附加信息文本。
- setDetailedText:设置对话框的详细信息文本,可以折叠展开。
- setStandardButtons(QMessageBox::Ok):设置对话框的标准按钮(如 Yes、No、Ok、Cancel 等)。
- setDefaultButton:设置默认按钮。
- 消息对话框一般结合模态使用。
- 释放消息对话框,可以使用setAttribute(Qt::WA_DeleteOnClose)。当使用模态时也可以直接delete。
void MainWindow::on_pushButton_clicked() { QMessageBox* box=new QMessageBox(); box->setWindowTitle("这是QMessageBox对话框"); box->setIcon(QMessageBox::Warning); box->setText("原神,启动!!!"); box->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::No); box->exec(); delete box; }
9.为QMessageBox添加自定义按钮:
- 首先通过QPushButton类创建pushButton对象:QPushButton* button=new QPushButton("按钮名称",messageBox);
- 然后通过addButton(button,QMessageBox::AcceptrRole)方法,将自定义按钮添加到消息对话框。
- 一般来说不常用自定义按钮,而是通过Qt提供的按钮,在exec关闭窗口返回一个值后,接收到返回值得知点击的是哪个按钮,再判断该怎么处理。
int ret=messageBox->exec(); if(ret==QMessageBox::Save){} else if(ret==QMessageBox::Yes){} else if(ret==QMessageBox::Ok){}
10.通过静态方法,一句话创建一个messageBox:
- 以下方式创建的对话框,不需要手动释放。
static StandardButton warning/information/question/critical (QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton);
- parent:对话框的父窗口。可以是 nullptr,表示没有父窗口。
- title:对话框的标题。
- text:对话框中显示的警告信息。
- buttons:对话框中显示的按钮,默认值为 QMessageBox::Ok。可以是按钮的组合,使用 | 分隔多个按钮。
- defaultButton:默认选中的按钮,默认值为 QMessageBox::NoButton。
- 实例演示:
QMessageBox::warning(this,"这是warning对话框","这是弹窗信息",QMessageBox::Yes | QMessageBox::Ok);
11.QColorDialog-颜色对话框:
static QColor getColor (const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = QColorDialog::ShowAlphaChannel);
initial:对话框初始显示的颜色,默认为白色 (Qt::white)。
parent:对话框的父窗口,可以是 nullptr,表示没有父窗口。
title:对话框的标题,默认为空字符串。
options:对话框的选项,可以是 QColorDialog::ColorDialogOptions 的组合,默认值为 QColorDialog::ShowAlphaChannel,表示显示 Alpha 通道(透明度)的选项。
- 实例演示:
QColor color = QColorDialog::getColor(Qt::red, this, "选择颜色", QColorDialog::ShowAlphaChannel | QColorDialog::DontUseNativeDialog);
12.QFileDialog-文件对话框:
- 选择一个文件进行打开操作。
static QString getOpenFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = QFileDialog::Options());
- 选择多个文件进行打开操作。
static QStringList getOpenFileNames (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = QFileDialog::Options());
选择一个文件进行保存操作。
static QString getSaveFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = QFileDialog::Options());
- 选择一个目录。
static QString getExistingDirectory (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), QFileDialog::Options options = ShowDirsOnly);
- 静态函数,使用方法和上面的集中对话框类似。