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

(五)QT——QDialog 对话框

目录

前言

QDialog 主要功能

QDialog 使用方法

基本QDialog

应用程序级别的模态对话框

标准对话框

示例代码

功能展示

总结

1. 基本功能

2. 创建方式

3. 常用方法


前言

QDialogQt 框架中的对话框类,用于创建模态(modal)或非模态(modeless)的对话框窗口,常用于获取用户输入、显示消息或进行配置设置。


QDialog 主要功能

  • 模态与非模态

    • 模态对话框(Modal):阻塞父窗口,必须关闭后才能返回主界面。
    • 非模态对话框(Modeless):不阻塞父窗口,可以并行操作主界面。
  • 返回值

    • QDialog::exec() 返回 Accepted(1)或 Rejected(0),用于确定用户的选择。
    • QDialog::done(int result) 设置对话框的返回值,并关闭对话框。
    • QDialog::accept() 触发 Accepted 关闭对话框。
    • QDialog::reject() 触发 Rejected 关闭对话框。
  • 信号与槽

    • accepted():点击 确定 或手动调用 accept() 触发。
    • rejected():点击 取消 或手动调用 reject() 触发。

QDialog 使用方法

基本QDialog

修改 mainwindow.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();

private slots:
    void onSubmitClicked();

private:
    QLineEdit *lineEdit;
    QLabel *label;
    QPushButton *submitButton;
};

#endif // DIALOG_H

修改 mainwindow.cpp

#include "mainwindow.h"
#include <QVBoxLayout>
#include <QHBoxLayout>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent)
{
    setWindowTitle("Custom Dialog");
    resize(300, 150);

    label = new QLabel("Enter your name:", this);
    lineEdit = new QLineEdit(this);
    submitButton = new QPushButton("Submit", this);

    QVBoxLayout *mainLayout = new QVBoxLayout();
    mainLayout->addWidget(label);
    mainLayout->addWidget(lineEdit);
    
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->addWidget(submitButton);
    
    mainLayout->addLayout(buttonLayout);
    setLayout(mainLayout);

    connect(submitButton, &QPushButton::clicked, this, &Dialog::onSubmitClicked);
}

Dialog::~Dialog() {}

void Dialog::onSubmitClicked()
{
    QString text = lineEdit->text();
    label->setText("Hello, " + text + "!");
}

修改main.cpp

#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QMainWindow mainWindow;
    QPushButton *openDialogButton = new QPushButton("Open Dialog", &mainWindow);
    
    mainWindow.setCentralWidget(openDialogButton);
    mainWindow.resize(200, 100);
    
    Dialog *dialog = new Dialog(&mainWindow);
    
    QObject::connect(openDialogButton, &QPushButton::clicked, dialog, &Dialog::show);

    mainWindow.show();
    return a.exec();
}

代码解释

  • Dialog 类中,我们使用了 QVBoxLayoutQHBoxLayout 来布局控件。QVBoxLayout 用于垂直排列标签和输入框,而 QHBoxLayout 用于排列按钮。
  • 当点击 submitButton 按钮时,onSubmitClicked() 方法会被调用,更新标签显示内容为输入框中的文本。
  • Dialog::show() 会弹出自定义对话框。

这个例子展示了如何在 Qt 中使用 QDialog 创建一个简单的对话框,捕获用户输入并更新界面内容。你可以根据自己的需求扩展对话框的功能,添加更多的控件和交互功能。

应用程序级别的模态对话框

应用程序级别的模态对话框会阻止用户访问应用程序的所有其他窗口,直到该对话框关闭。通常用于需要用户作出决定或输入信息的情况,例如“保存更改”或“确认删除”弹窗。

使用 QDialog::exec() 显示对话框。

  • 创建 Qt Widgets Application 项目
  • 在主窗口添加按钮,点击按钮打开模态对话框
  • 在对话框窗口中添加确认按钮
  • 使用 exec() 方法阻塞主窗口

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onOpenDialog();  // 处理按钮点击事件

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mydialog.h"
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建一个按钮并设置文本
    QPushButton *button = new QPushButton("打开模态对话框", this);
    button->setGeometry(50, 50, 200, 40);

    // 连接按钮点击信号到槽函数
    connect(button, &QPushButton::clicked, this, &MainWindow::onOpenDialog);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 处理打开对话框的槽函数
void MainWindow::onOpenDialog()
{
    MyDialog dialog(this);  // 传递主窗口作为父窗口
    dialog.exec();          // 以模态方式阻塞主窗口
}

对话框 (MyDialog)

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

class QPushButton;

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MyDialog(QWidget *parent = nullptr);
    ~MyDialog();

private:
    QPushButton *confirmButton;
};
#endif // MYDIALOG_H

mydialog.cpp

#include "mydialog.h"
#include <QPushButton>
#include <QVBoxLayout>

MyDialog::MyDialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("模态对话框");
    resize(300, 150);

    confirmButton = new QPushButton("确认", this);

    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(confirmButton);
    setLayout(layout);

    // 连接确认按钮点击信号到关闭对话框的槽函数
    connect(confirmButton, &QPushButton::clicked, this, &QDialog::accept);
}

MyDialog::~MyDialog() {}

运行效果

  1. 启动应用后,主窗口显示 "打开模态对话框" 按钮。
  2. 点击按钮后,会弹出一个 应用程序级模态对话框,阻止用户操作主窗口。
  3. 只有点击 "确定" 关闭对话框后,才能继续使用主窗口。

标准对话框

所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。

Qt 内置的标准对话框主要包括以下几类:

对话框功能
QMessageBox消息框,用于显示信息、警告、错误或询问用户
QFileDialog选择文件或目录
QColorDialog选择颜色
QFontDialog选择字体
QInputDialog让用户输入一个值
QPageSetupDialog纸张设置(用于打印)
QPrintDialog配置打印机
QPrintPreviewDialog打印预览
QProgressDialog显示进度条,适用于耗时任务

示例代码

下面是一个包含 消息框、文件选择框、颜色选择框、输入框 的示例:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void showMessageBox();
    void showFileDialog();
    void showColorDialog();
    void showInputDialog();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QColorDialog>
#include <QInputDialog>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPushButton *msgBoxButton = new QPushButton("消息框", this);
    msgBoxButton->setGeometry(50, 30, 150, 40);
    connect(msgBoxButton, &QPushButton::clicked, this, &MainWindow::showMessageBox);

    QPushButton *fileDialogButton = new QPushButton("打开文件", this);
    fileDialogButton->setGeometry(50, 80, 150, 40);
    connect(fileDialogButton, &QPushButton::clicked, this, &MainWindow::showFileDialog);

    QPushButton *colorDialogButton = new QPushButton("选择颜色", this);
    colorDialogButton->setGeometry(50, 130, 150, 40);
    connect(colorDialogButton, &QPushButton::clicked, this, &MainWindow::showColorDialog);

    QPushButton *inputDialogButton = new QPushButton("输入对话框", this);
    inputDialogButton->setGeometry(50, 180, 150, 40);
    connect(inputDialogButton, &QPushButton::clicked, this, &MainWindow::showInputDialog);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// 1. 显示消息框
void MainWindow::showMessageBox()
{
    QMessageBox::information(this, "信息", "这是一个消息框示例!");
}

// 2. 文件选择对话框
void MainWindow::showFileDialog()
{
    QString fileName = QFileDialog::getOpenFileName(this, "选择文件", "", "所有文件 (*.*);;文本文件 (*.txt)");
    if (!fileName.isEmpty()) {
        QMessageBox::information(this, "选择的文件", fileName);
    }
}

// 3. 颜色选择对话框
void MainWindow::showColorDialog()
{
    QColor color = QColorDialog::getColor(Qt::white, this, "选择颜色");
    if (color.isValid()) {
        QMessageBox::information(this, "选定的颜色", color.name());
    }
}

// 4. 输入对话框
void MainWindow::showInputDialog()
{
    bool ok;
    QString text = QInputDialog::getText(this, "输入对话框", "请输入你的名字:", QLineEdit::Normal, "", &ok);
    if (ok && !text.isEmpty()) {
        QMessageBox::information(this, "输入的内容", "你的名字是:" + text);
    }
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

功能展示

  • 消息框(QMessageBox

    • 点击按钮弹出信息提示框。
  • 文件选择对话框(QFileDialog

    • 让用户选择文件,并显示文件路径。
  • 颜色选择对话框(QColorDialog

    • 选择颜色,并显示颜色代码。
  • 输入对话框(QInputDialog

    • 让用户输入内容,并显示输入的值

使用 Qt 内置的 标准对话框 可以大幅简化 UI 开发,提高开发效率,同时保证一致性和跨平台兼容性。 🚀


总结

1. 基本功能

  • 显示对话框QDialog 可以创建一个模态或非模态的对话框,模态对话框会阻塞用户与主界面的交互,而非模态对话框不会。
  • 返回值QDialog 可以通过 exec() 方法显示并执行对话框,返回一个状态值(如 AcceptedRejected),指示用户操作的结果。
  • 窗口控件:可以在对话框中添加按钮、文本框、标签等控件,方便与用户进行交互。

2. 创建方式

  • 子类化:用户可以通过继承 QDialog 类,创建自定义的对话框。
  • 标准对话框:Qt 提供了许多标准对话框,如文件选择、颜色选择等,用户可以直接使用,而不需要自己实现。

3. 常用方法

  • exec():启动对话框并进入事件循环,返回对话框的结果。
  • accept():当用户完成对话框任务并选择“确定”时调用,关闭对话框并返回 Accepted 状态。
  • reject():当用户选择“取消”时调用,关闭对话框并返回 Rejected 状态。
  • setModal():设置对话框是否为模态对话框。默认为 false,即非模态对话框。

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

相关文章:

  • 【LeetCode】152、乘积最大子数组
  • 基础相对薄弱怎么考研
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter2-HTML 中的 JavaScript
  • 【ABB阀门定位器EDP300如何进行自整定】
  • sentinel的限流原理
  • 逻辑起源 - 比较DS与豆包对“逻辑”源头的提炼差异
  • 第八篇:数据库的安全性与权限管理
  • 求解大规模单仓库多旅行商问题(LS-SDMTSP)的成长优化算法(Growth Optimizer,GO),MATLAB代码
  • Android原生开发问题汇总
  • react使用DatePicker日期选择器
  • UE学习日志#23 C++笔记#9 编码风格
  • Ubuntu重启搜狗输入法
  • 安卓路由与aop 以及 Router-api
  • golang轻量级版本管理工具g安装使用
  • Python 数据挖掘与机器学习
  • 【GeeRPC】7天用 Go 从零实现 RPC 框架 GeeRPC
  • python知识阶段小练习
  • 基于Java(MVC)+MySQL实现的心理咨询预约管理系统
  • 蛋糕商城 Rust 版介绍
  • Unity DoTween使用文档
  • deepseek API 调用-python
  • java 8 在 idea 无法创建 java spring boot 项目的 变通解决办法
  • react的antd中Cascader级联选择如何回显
  • 网络安全 风险评估指南 网络安全风险测评
  • Nginx 请求超时
  • CEF132 编译指南 Windows 篇 - 安装 Visual Studio 2022 (二)