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

[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:可供选择的条目

测试:

运行:


http://www.kler.cn/a/505802.html

相关文章:

  • 深度学习-87-大模型训练之预训练和微调所用的数据样式
  • Linux内核的启动
  • 初始Java4
  • Termora跨平台 SSH/SFTP/Terminal 客户端工具
  • Linux 机器学习
  • 计算机网络(五)——传输层
  • 数据仓库的复用性:设计和构建一个高复用性的数仓
  • 软考信安20~数据库系统安全
  • 数据通过canal 同步es,存在延迟问题,解决方案
  • Web前端------HTML多媒体标签之音频和视频标签
  • 【MATLAB】subplot如何增加title
  • 如何开发一个分布式日志系统
  • 线上nginx编译参数
  • 回归预测 | MATLAB实SVM支持向量机多输入单输出回归预测
  • 设计模式02:结构型设计模式之适配器模式使用情景及其基础Demo
  • 反转字符串力扣--344
  • Abp vnext + OpenIddict的授权械与适应场景
  • Apache MINA 使用简单Demo案例
  • js使用qrcode与canvas生成带logo的二维码
  • lua下标是可以从0开始
  • Oracle+11g+笔记(9)-控制文件及日志文件的管理
  • 使用 Python 编写一个简单的聊天机器人
  • 手撕Transformer -- Day7 -- Decoder
  • 【大模型系列篇】数字人音唇同步模型——腾讯开源MuseTalk
  • nolo sonic 2使用串流方式运行steamVR时报错301(VRApplicationError_IPCFailed)
  • idea分支合并代码