(五)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…

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

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

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

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

使用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…

数据结构及排序算法

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

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…

ssti学习笔记(服务器端模板注入)

目录 一&#xff0c;ssti是什么 二&#xff0c;原理 所谓模板引擎&#xff08;三列&#xff0c;可滑动查看&#xff09; 三&#xff0c;漏洞复现 1&#xff0c;如何判断其所属的模板引擎&#xff1f; 2&#xff0c;判断清楚后开始注入 &#xff08;1&#xff09;Jinja2&a…

【前端】Python 闭包与JavaScript闭包的实现差异

目录 Python 闭包JavaScript 闭包 推荐超级课程&#xff1a; Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 Python 闭包 如何定义&#xff1a; 在一个函数内部定义另一个函数&#xff0c;内部函数引用外部函数的变量。 def outer_function(text):…

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种&#xff1a; class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示&#xff1a; 每个 class 的字节码文件中都有一个常量池&#xff0c;里面是编译后即知的该 class 会用到的字面量与符号引…

人工智能入门 数学基础 线性代数 笔记

必备的数学知识是理解人工智能不可或缺的要素&#xff0c;今天的种种人工智能技术归根到底都建立在数学模型之上&#xff0c;而这些数学模型又都离不开线性代数&#xff08;linear algebra&#xff09;的理论框架。 线性代数的核心意义&#xff1a;世间万事万物都可以被抽象成某…

C# Winform怎么设计串口,客户端和相机控件界面显示

首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法&#xff0c;其中的节点&#xff08;Section)、键&#xff08;KEY&#x…

在 Windows 上使用 ZIP 包安装 MySQL 的详细步骤

以下是使用官方 ZIP 包在 Windows 上安装 MySQL 的详细步骤&#xff0c;确保能通过 mysql -uroot -p 成功连接。 步骤 1&#xff1a;下载 MySQL ZIP 包 访问 MySQL 官方下载页面&#xff1a; https://dev.mysql.com/downloads/mysql/选择 Windows (x86, 64-bit), ZIP Archive&…

el-table表格点击单元格实现编辑

使用 el-table 和 el-table-column 创建表格。在单元格的默认插槽中&#xff0c;使用 div 显示文本内容&#xff0c;单击时触发编辑功能。使用 el-input 组件在单元格中显示编辑框。data() 方法中定义了 tableData&#xff0c;tabClickIndex: null,tabClickLabel: ,用于判断是否…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…