(五)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_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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.mzph.cn/web/69365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 语音识别方案对比

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

TensorFlow域对抗训练DANN神经网络分析MNIST与Blobs数据集梯度反转层提升目标域适应能力可视化...

全文链接&#xff1a;https://tecdat.cn/?p39656 本文围绕基于TensorFlow实现的神经网络对抗训练域适应方法展开研究。详细介绍了梯度反转层的原理与实现&#xff0c;通过MNIST和Blobs等数据集进行实验&#xff0c;对比了不同训练方式&#xff08;仅源域训练、域对抗训练等&am…

[论文笔记] Deepseek-R1R1-zero技术报告阅读

启发: 1、SFT&RL的训练数据使用CoT输出的格式,先思考再回答,大大提升模型的数学与推理能力。 2、RL训练使用群体相对策略优化(GRPO),奖励模型是规则驱动,准确性奖励和格式化奖励。 1. 总体概述 背景与目标 报告聚焦于利用强化学习(RL)提升大型语言模型(LLMs)…

rust安装笔记

安装笔记 安装加速cargo 国内源nightly版本安装其他目标将现有项目迁移到新版本升级 安装加速 export RUSTUP_UPDATE_ROOT"https://mirrors.ustc.edu.cn/rust-static/rustup" export RUSTUP_DIST_SERVERhttps://mirrors.tuna.tsinghua.edu.cn/rustup curl --proto h…

OSPF基础(2):数据包详解

OSPF数据包(可抓包) OSPF报文直接封装在IP报文中&#xff0c;协议号89 头部数据包内容&#xff1a; 版本(Version):对于OSPFv2&#xff0c;该字段值恒为2(使用在IPV4中)&#xff1b;对于OSPFv3&#xff0c;该字段值恒为3(使用在IPV6中)。类型(Message Type):该OSPF报文的类型。…

Leetcode面试高频题分类刷题总结

https://zhuanlan.zhihu.com/p/349940945 以下8个门类是面试中最常考的算法与数据结构知识点。 排序类&#xff08;Sort&#xff09;&#xff1a; 基础知识&#xff1a;快速排序&#xff08;Quick Sort&#xff09;&#xff0c; 归并排序&#xff08;Merge Sort&#xff09;的…

ubuntu文件同步

1. 使用 rsync 同步文件 rsync 是一个常用的文件同步工具&#xff0c;可以在本地或远程系统之间同步文件和目录。 基本用法&#xff1a; rsync -avz /源目录/ 目标目录/-a&#xff1a;归档模式&#xff0c;保留文件属性。-v&#xff1a;显示详细输出。-z&#xff1a;压缩传输…

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…

详解Swift中 Sendable AnyActor Actor GlobalActor MainActor Task、await、async

详解Swift中 Sendable AnyActor Actor GlobalActor MainActor 的关联或者关系 及其 各自的作用 和 用法 以及与 Task、await、async&#xff1a; Sendable 协议 作用&#xff1a; Sendable 是一个协议&#xff0c;它用于标记可以安全地跨线程或异步任务传递的数据类型。符合 S…

使用VCS对Verilog/System Verilog进行单步调试的步骤

Verilog单步调试&#xff1a; System Verilog进行单步调试的步骤如下&#xff1a; 1. 编译设计 使用-debug_all或-debug_pp选项编译设计&#xff0c;生成调试信息。 我的4个文件&#xff1a; 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…

Kotlin 2.1.0 入门教程(十)if、when

if 表达式 if 是一个表达式&#xff0c;它会返回一个值。 不存在三元运算符&#xff08;condition ? then : else&#xff09;&#xff0c;因为 if 在这种场景下完全可以胜任。 var max aif (a < b) max bif (a > b) {max a } else {max b }max if (a > b) a…

数据结构及排序算法

数据结构 线性结构 ◆线性结构:每个元素最多只有一个出度和一个入度,表现为一条线状。线性表按存储方式分为顺序表和链表。 存储结构: ◆顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素物理上也相邻。 ◆链式存储:存储各数据元素的结点…

camera系统之cameraprovider

在相机系统中&#xff0c;CameraProvider是一个至关重要的组件。以下是对CameraProvider的详细解释&#xff1a; 一、定义与位置 CameraProvider是相机系统的下层组件&#xff0c;位于CameraService以下和Camera HAL&#xff08;硬件抽象层&#xff09;以上。它作为一个独立进…

python实现多路视频,多窗口播放功能

系列Python开发 文章目录 系列Python开发前言一、python实现多路视频播放功能二、代码实现1. http申请视频流地址并cv2播放功能 三、打包代码实现生成可执行文件 总结 前言 一、python实现多路视频播放功能 服务端开发后通常需要做功能测试、性能测试&#xff0c;通常postman、…

【R语言】数据操作

一、查看和编辑数据 1、查看数据 直接打印到控制台 x <- data.frame(a1:20, b21:30) x View()函数 此函数可以将数据以电子表格的形式进行展示。 用reshape2包中的tips进行举例&#xff1a; library("reshape2") View(tips) head()函数 查看前几行数据&…

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目&#xff0c;新建 2.新建目录 3.选择目标机器&#xff0c;直接搜索at89c52选择&#xff0c;然后点击OK 4.是否添加起吊文件&#xff0c;一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键&#xff0c;添加…

STM32 软件SPI读写W25Q64

接线图 功能函数 //写SS函数 void My_W_SS(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue); }//写SCK函数 void My_W_SCK(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue); }//写MOSI函数 void My_W_MOSI(uint8_t Bit…

apachePoi中XSSFClientAnchor图片坐标简述;填充多张图片

概述 业务中经常会遇到在单元格内填充图片的需求&#xff0c;而且要求指定图片在单元格内的位置。 一般都是用的apache的poi&#xff0c;设置图片坐标。 HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)dx1 dy1 起始单元…

Centos挂载镜像制作本地yum源,并补装图形界面

内网环境centos7.9安装图形页面内网环境制作本地yum源 上传镜像到服务器目录 创建目录并挂载镜像 #创建目录 cd /mnt/ mkdir iso#挂载 mount -o loop ./CentOS-7-x86_64-DVD-2009.iso ./iso #前面镜像所在目录&#xff0c;后面所挂载得目录#检查 [rootlocalhost mnt]# df -h…

百科词条创建审核不通过的原因有哪些?

我们知道的国内有名的百科网站有百度百科、快懂百科、搜狗百科、360百科,这些有名的百科网站。一般来说,百科的词条排名都是在第一页的,无论是名人、明星、软件、影视名称,还是其他名称,大多排名都在首页,这就拥有了更多的曝光量和流量,而且由于百科是人们获取信息、查找资料的…