Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍自定义Dialog组件的常用方法及灵活运用。

在之前的文章中笔者已经为大家展示了默认Dialog组件的使用方法,虽然内置组件支持对数据的输入,但有时候我们需要一次性输入多个数据,此时如果之使用默认模态对话框似乎不太够用,此时我们需要自己创建一个自定义对话框,需要说明的是此类对话框也是一种窗体,所以可以在其上面放置任何通用组件,以实现更多复杂的开发需求。

自定义对话框需要解决的问题是,如何让父窗体与子窗体进行数据交换,要实现数据的交换有两种方式,第一种方式是通过动态加载模态对话框,当用户点击确定后通过GetValue()来拿到数据,而第二种方式则是通过发送信号的方式将数据投递给父窗体,这两种方式都可以,读者可根据自身需求来选择不同的通信方式。

1.1 使用模态对话框传值

首先我们需要创建一个自定义对话框,在Qt中创建对话框很容易,具体创建流程如下所示:

  • 选择项目 -> AddNew -> QT -> Qt设计师界面类 -> 选择DialogWithoutButtons -> 命名为Dialog保存

此时直接点击下一步按钮,并选中Forms/dialog.ui界面编辑菜单,在编辑栏中我们分别增加一个LineEdit编辑框,以及两个PushButton按钮组件,将第一个组件命名为BtnOk将第二个组件命名为BtnCancel,界面如下所示;

当做完页面布局后,其次我们还需要在Dialog.ui组件上增加两个信号,分别是点击关闭,并将信号关联到两个槽函数上,其信号应该写成如下图所示。

如上图,accept()QDialog 类的一个公共槽函数。调用这个槽函数会触发对话框的接受(accept)操作,通常用于模拟用户点击对话框的“确定”按钮。同样的reject() 也是 QDialog 类的一个公共槽函数。调用这个槽函数会触发对话框的拒绝(reject)操作,通常用于模拟用户点击对话框的“取消”按钮。

接着我们点开模态对话框的dialog.cpp对话框类,其类内需要定义两个成员函数,它们的功能如下:

  • 第一个 GetValue() 用来获取当前编辑框内的数据并将数据返回给父窗体。
  • 第二个 SetValue() 用来接收传入的参数,并将此参数设置到自身窗体中的编辑框内。
#include "dialog.h"
#include "ui_dialog.h" Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this);
} // 用于MainWindow获取编辑框中的数据
QString Dialog::GetValue()
{
return ui->lineEdit->text();
} // 用于设置当前编辑框中的数据为MainWindow
void Dialog::SetValue(QString x)
{
ui->lineEdit->setText(x);
} Dialog::~Dialog()
{
delete ui;
}

接着我们来看一下MainWindow函数中是如何接收参数的,对于主窗体来说,当用户点击on_pushButton_clicked()按钮时,我们需要动态将自己创建的Dialog加载,读取出主窗体编辑框内的值并设置到子窗体内,当用户按下QDialog::Accepted时则是获取子窗体内的值,此时通过调用ptr->GetValue()子窗体的成员函数来返回一个字符串,并将其设置到父窗体的编辑框内,主函数代码如下所示;

// 首先要包含Dialog对话框类
#include "dialog.h" #include <iostream>
#include <QDialog> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->setEnabled(false);
ui->lineEdit->setText("hello lyshark");
} MainWindow::~MainWindow()
{
delete ui;
} // 按钮点击后执行
void MainWindow::on_pushButton_clicked()
{
// 创建模态对话框
Dialog *ptr = new Dialog(this); // 创建一个对话框
Qt::WindowFlags flags = ptr->windowFlags(); // 需要获取返回值
ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 设置对话框固定大小 // 读取MainWindows参数并设置到Dialog
QString item = ui->lineEdit->text();
ptr->SetValue(item); int ref = ptr->exec(); // 以模态方式显示对话框
if (ref==QDialog::Accepted) // OK键被按下,对话框关闭
{
// 当BtnOk被按下时,则设置对话框中的数据
QString the_value = ptr->GetValue();
std::cout << "value = " << the_value.toStdString().data() << std::endl;
ui->lineEdit->setText(the_value);
} // 删除释放对话框句柄
delete ptr;
}

至此就实现了参数的子窗体传递到父窗体,如下图所示;

2.1 使用信号传值

对于信号传值,我们需要在dialog.h头文件中增加sendText()信号,以及on_pushButton_clicked()槽函数的声明部分,如下所示;

// 定义信号(信号只需声明无需实现)
signals:
void sendText(QString str);
private slots:
void on_pushButton_clicked();

而在dialog.cpp实现部分,我们首先需要将子窗体中的按钮组件绑定到onBtnClick()槽函数上面,当需要发送数据时直接通过调用emit sendText触发信号,并携带子窗体中send_data的数据;

#include "dialog.h"
#include "ui_dialog.h" Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this); // 连接pushButton到onBtnClick上
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onBtnClick()));
} Dialog::~Dialog()
{
delete ui;
} // 发送信号到MainWindow
void Dialog::on_pushButton_clicked()
{
QString send_data = ui->lineEdit->text();
emit sendText(send_data);
}

接着是在mainwindow.h头文件定义中,新增槽函数receiveMsg()函数用来接收信号的传值。

private slots:
// 定义槽函数
void receiveMsg(QString str);
void on_pushButton_clicked();

mainwindow.cpp实现部分,接收到信号后的槽函数receiveMsg其内部可以直接将参数设置到父类窗口的lineEdit组件上,而当on_pushButton_clicked按钮被点击是,我们只需要加载自己的子窗体,并Connect链接槽函数receiveMsg上面,当做完这一切之后,再通过subwindow->show()让子窗体显示出来。

#include "mainwindow.h"
#include "ui_mainwindow.h" #include "dialog.h"
#include <QDialog> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit->setEnabled(false);
} // 接收信号并设置到LineEdit上
void MainWindow::receiveMsg(QString str)
{
ui->lineEdit->setText(str);
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::on_pushButton_clicked()
{
Dialog *subwindow = new Dialog(this);
// 当收到sendText信号时使用receiveMsg槽函数处理
connect(subwindow, SIGNAL(sendText(QString)), this, SLOT(receiveMsg(QString)));
subwindow->show();
}

当然,此类对话框是非模态的,读者可以拖动父对话框,而由于是信号控制,所以当发送参数到父窗体后,子窗体并不会立即关闭,如下图所示;

完整案例下载

C++ Qt开发:自定义Dialog对话框组件的更多相关文章

  1. C/C++ Qt 自定义Dialog对话框组件应用

    在上一篇博文 <C/C++ Qt 标准Dialog对话框组件应用> 中我给大家演示了如何使用Qt中内置的标准对话框组件实现基本的数据输入功能. 但有时候我们需要一次性修改多个数据,使用默认 ...

  2. Android中制作自定义dialog对话框的实例

    http://www.jb51.net/article/83319.htm   这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...

  3. 第二百零四节,jQuery EasyUI,Dialog(对话框)组件

    jQuery EasyUI,Dialog(对话框)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解EasyUI中Dialog(窗口)组件的使用方法,这个组件依赖 ...

  4. Taro自定义Modal对话框组件|taro仿微信、android弹窗

    基于Taro多端实践TaroPop:自定义模态框|dialog对话框|msg消息框|Toast提示 taro自定义弹出框支持编译到多端H5/小程序/ReactNative,还可以自定义弹窗类型/弹窗样 ...

  5. Android自定义 Dialog 对话框

    Android自定义Dialoghttp://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html Android使用自定义AlertDialo ...

  6. C/C++ Qt Dialog 对话框组件应用

    在Qt中对话框分为两种形式,一种是标准对话框,另一种则是自定义对话框,在一般开发过程中标准对话框使用是最多的了,标准对话框一般包括 QMessageBox,QInputDialog,QFileDial ...

  7. Dialog( 对话框) 组件

    一. 加载方式//class 加载方式<div class="easyui-dialog" title="My Dialog"style="wi ...

  8. 【开发】Dialog 对话框

    提示:Dialog 继承自 Panel,有大量的方法在 Panel 中已被定义,可以复用. Dialog API:http://www.jeasyui.net/plugins/181.html Pan ...

  9. Java Swing 自定义Dialog确认对话框

    Java Swing 自定义Dialog 需求:当点击JFrame窗口的关闭按钮时,弹框询问是否确定关闭窗口,如果是则关闭程序,否就让弹框消失什么也不做(使用Dialog). 分析:虽然Java提供了 ...

  10. vue3系列:vue3.0自定义弹框组件V3Popup|vue3.x手机端弹框组件

    基于Vue3.0开发的轻量级手机端弹框组件V3Popup. 之前有分享一个vue2.x移动端弹框组件,今天给大家带来的是Vue3实现自定义弹框组件. V3Popup 基于vue3.x实现的移动端弹出框 ...

随机推荐

  1. AI绘图开源工具Stable Diffusion WebUI前端API对接

    背景 本文主要介绍 AI 绘图开源工具 Stable Diffusion WebUI 的 API 开启和基本调用方法,通过本文的阅读,你将了解到 stable-diffusion-webui 的基本介 ...

  2. 【译】.NET 8 拦截器(interceptor)

    通常情况下,出于多种原因,我不会说我喜欢写关于预览功能的文章.我的大多数帖子旨在帮助人们解决他们可能遇到的问题,而不是找个肥皂盒或打广告.但是我认为我应该介绍这个 .NET 预览特性,因为它是我在 . ...

  3. 4.3 IAT Hook 挂钩技术

    IAT(Import Address Table)Hook是一种针对Windows操作系统的API Hooking 技术,用于修改应用程序对动态链接库(DLL)中导入函数的调用.IAT是一个数据结构, ...

  4. Linux/Unix-CPU-SuperPI-Unixbench性能测试

    测试服务器CPU单核及多核SuperPI圆周率测试real和user值,SuperPI是利用CPU的浮点运算能力来计算出π(圆周率),测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间:及Un ...

  5. Django框架项目——BBS项目介绍、表设计、表创建同步、注册、登录功能、登录功能、首页搭建、admin、头像、图片防盗、个人站点、侧边栏筛选、文章的详情页、点赞点踩、评论、后台管理、添加文章、头像

    文章目录 1 BBS项目介绍.表设计 项目开发流程 表设计 2 表创建同步.注册.登录功能 数据库表创建及同步 注册功能 登陆功能 3 登录功能.首页搭建.admin.头像.图片防盗.个人站点.侧边栏 ...

  6. LogicFlow 是一款流程图编辑框架

    简体中文 | English LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互.编辑所必需的功能和简单灵活的节点自定义.插件等拓展机制,方便我们快速在业务系统内满足类流程图的需求. 特 ...

  7. Fortran 的简单入门和使用 OpenMPI

    Fortran 与 C-like 语言的区别简单总结 无大括号,使用关键字画出范围: C++: int main() { } Fortran: program test implicit none e ...

  8. 打造炫酷效果:用Java优雅地制作Excel迷你图

    摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 迷你图是一种简洁而有效的数据可视化方式,常用于展示趋势和变化.它 ...

  9. 【源码解读(一)】EFCORE源码解读之创建DBContext查询拦截

    引言 在网上很少看到有关于系统讲解EFCore源码的,可能大概也许是因为EFCore的源码总体是没有asp.net web的源码流程清晰,正如群友所说,EFCore的源码大致看起来有点凌乱,与其说凌乱 ...

  10. 传输层协议:TCP/IP协议,UDP的协议

    传输层: 定义了⼀些传输数据的协议和端口号( WWW 端口 80 等),如:TCP(传输控制协议,传输效率低,可靠性强,⽤于传输可靠性要求⾼,数据量⼤的数据), UDP(⽤户数据报协议,与 TCP 特 ...