在上一篇博文 《C/C++ Qt 标准Dialog对话框组件应用》 中我给大家演示了如何使用Qt中内置的标准对话框组件实现基本的数据输入功能。

但有时候我们需要一次性修改多个数据,使用默认的模态对话框似乎不太够用,此时我们需要自己创建一个自定义对话框,这类对话框也是一种窗体,所以可以在其上面放置任何的通用组件,以实现更多复杂的开发需求。

目前自定义对话框与主窗体的通信有两种方式,一种是通过函数实现通信,另一种则是通过信号实现通信,我们以通过函数通信为基础,解释一下如何实现跨窗体通信。

首先需要创建一个自定义对话框,对话框具体创建流程如下

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

直接选中Dianlog.ui并绘制界面为以下,一个编辑框,两个按钮。

其次需要在Dialog对话框上增加两个信号,分别是点击关闭,并将信号关联到两个槽函数上,其信号应该写成如下样子。

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

  • 第一个 GetValue() 用来获取当前编辑框内的数据并将数据返回给父窗体。
  • 第二个 SetValue() 用来接收传入的参数,并将此参数设置到自身窗体中的编辑框内。
  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
  4. {
  5. ui->setupUi(this);
  6. }
  7. // 用于MainWindow获取编辑框中的数据
  8. QString Dialog::GetValue()
  9. {
  10. return ui->lineEdit->text();
  11. }
  12. // 用于设置当前编辑框中的数据为MainWindow
  13. // https://www.cnblogs.com/lyshark
  14. void Dialog::SetValue(QString x)
  15. {
  16. ui->lineEdit->setText(x);
  17. }
  18. Dialog::~Dialog()
  19. {
  20. delete ui;
  21. }
  22. void Dialog::on_BtnOk_clicked()
  23. {
  24. }
  25. void Dialog::on_BtnCancel_clicked()
  26. {
  27. }

对于主函数来说,当用户点击on_pushButton_clicked()按钮时,我们需要动态将自己创建的Dialog加载,读取出主窗体编辑框内的值并设置到子窗体内,当用户按下QDialog::Accepted时则是获取子窗体内的值,并将其设置到父窗体的编辑框内,主函数代码如下所示.

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "dialog.h"
  4. #include <iostream>
  5. #include <QDialog>
  6. MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. ui->lineEdit->setEnabled(false);
  10. ui->lineEdit->setText("hello lyshark");
  11. }
  12. MainWindow::~MainWindow()
  13. {
  14. delete ui;
  15. }
  16. // By: LyShark
  17. // https://www.cnblogs.com/lyshark
  18. // 按钮点击后执行
  19. void MainWindow::on_pushButton_clicked()
  20. {
  21. // 创建模态对话框
  22. Dialog *ptr = new Dialog(this); // 创建一个对话框
  23. Qt::WindowFlags flags = ptr->windowFlags(); // 需要获取返回值
  24. ptr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 设置对话框固定大小
  25. // 读取MainWindows参数并设置到Dialog
  26. QString item = ui->lineEdit->text();
  27. ptr->SetValue(item);
  28. int ref = ptr->exec(); // 以模态方式显示对话框
  29. if (ref==QDialog::Accepted) // OK键被按下,对话框关闭
  30. {
  31. // 当BtnOk被按下时,则设置对话框中的数据
  32. QString the_value = ptr->GetValue();
  33. std::cout << "value = " << the_value.toStdString().data() << std::endl;
  34. ui->lineEdit->setText(the_value);
  35. }
  36. // 删除释放对话框句柄
  37. delete ptr;
  38. }

具体演示代码如下所示:

而对于信号版来说,我们需要在dialog.h头文件中增加sendText()信号,以及on_pushButton_clicked()槽函数的声明。

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. namespace Ui {
  5. class Dialog;
  6. }
  7. class Dialog : public QDialog
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit Dialog(QWidget *parent = nullptr);
  12. ~Dialog();
  13. // By: LyShark
  14. // https://www.cnblogs.com/lyshark
  15. private:
  16. Ui::Dialog *ui;
  17. // 定义信号(信号只需声明无需实现)
  18. signals:
  19. void sendText(QString str);
  20. private slots:
  21. void on_pushButton_clicked();
  22. };
  23. #endif // DIALOG_H

dialog.cpp中则在构造函数中建立连接,并提供一个发送到MainWindow中的按钮.

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. // By: LyShark
  4. // https://www.cnblogs.com/lyshark
  5. Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onBtnClick()));
  9. }
  10. Dialog::~Dialog()
  11. {
  12. delete ui;
  13. }
  14. // 发送信号到MainWindow
  15. void Dialog::on_pushButton_clicked()
  16. {
  17. QString send_data = ui->lineEdit->text();
  18. emit sendText(send_data);
  19. }

主窗体头文件mainwindow.h中定义receiveMsg接受数据的槽函数.

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. namespace Ui {
  5. class MainWindow;
  6. }
  7. class MainWindow : public QMainWindow
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit MainWindow(QWidget *parent = nullptr);
  12. ~MainWindow();
  13. // By: LyShark
  14. // https://www.cnblogs.com/lyshark
  15. private slots:
  16. // 定义槽函数
  17. void receiveMsg(QString str);
  18. void on_pushButton_clicked();
  19. private:
  20. Ui::MainWindow *ui;
  21. };
  22. #endif // MAINWINDOW_H

并在mainwindow.cpp中实现这个槽函数。

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "dialog.h"
  4. #include <QDialog>
  5. // By: LyShark
  6. // https://www.cnblogs.com/lyshark
  7. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. ui->lineEdit->setEnabled(false);
  11. }
  12. // 接收信号并设置到LineEdit上
  13. void MainWindow::receiveMsg(QString str)
  14. {
  15. ui->lineEdit->setText(str);
  16. }
  17. MainWindow::~MainWindow()
  18. {
  19. delete ui;
  20. }
  21. void MainWindow::on_pushButton_clicked()
  22. {
  23. Dialog *subwindow = new Dialog(this);
  24. // 当收到sendText信号时使用receiveMsg槽函数处理
  25. connect(subwindow, SIGNAL(sendText(QString)), this, SLOT(receiveMsg(QString)));
  26. subwindow->show();
  27. }

代码运行后与基于函数版的基本一致,但在灵活性上来说信号版更好一些。

C/C++ Qt 自定义Dialog对话框组件应用的更多相关文章

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

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

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

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

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

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

  4. Android自定义 Dialog 对话框

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

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

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

  6. Dialog( 对话框) 组件

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

  7. QT 自定义模态对话框

    新建一个MsgBox类 msgbox.h 代码 #ifndef MSGBOX_H #define MSGBOX_H #include <QDialog> #include <QPus ...

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

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

  9. 关于Element对话框组件Dialog在使用时的一些问题及解决办法

    Element对话框组件Dialog在我们的实际项目开发中可以说是一个使用频率较高的组件,它能为我们展示提示的功能,如:业务模块提交前展示我们曾经输入或选择过的业务信息,或者展示列表信息中某项业务的具 ...

随机推荐

  1. 关于SSTI的坑

    SSTI注入 进过几天的CSDN和博客园以及个人博客的查询,我大概讲一下我对SSTI模板注入的理解. SSTI注入指的是模板注入(应该翻译就是模板注入) 就站在我所了解的知识水平(大概就是大一随便水了 ...

  2. C# datagridview、datagrid、GridControl增加行号

    01 - WinForm中datagridview增加行号 在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加如下代码: private void dataGri ...

  3. 这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?

    大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...

  4. SharkCTF2021 pwn“初见”1

    (无内鬼 今日不想学了 水一篇) nc nc nc easyoverflow Intoverflow

  5. Scrum Meeting 0427

    零.说明 日期:2021-4-27 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分登录,注 ...

  6. [对对子队]会议记录4.17(Scrum Meeting8)

    今天已完成的工作 何瑞 ​ 工作内容:修复了一些bug,优化了UI ​ 相关issue:搭建关卡1 ​ 相关签入:4.17签入1 吴昭邦 ​ 工作内容:做了一些流水线系统的错误处理,添加了合成失败了之 ...

  7. 2021.8.4考试总结[NOIP模拟30]

    T1 毛衣衬 将合法子集分为两个和相等的集合. 暴力枚举每个元素是否被选,放在哪种集合,复杂度$O(3^n)$.考虑$\textit{meet in the middle}$. 将全集等分分为两部分分 ...

  8. Qt字符编码小知识

    1.VS2010默认编码是GBK,Qt5的内置编码是utf-8,想要在VS2010及其以上版本,优雅的使用utf-8的字符编码需要 // Coding: UTF-8(BOM) #if defined( ...

  9. 穿点最多的直线 牛客网 程序员面试金典 C++

    穿点最多的直线 牛客网 程序员面试金典 C++ 题目描述 在二维平面上,有一些点,请找出经过点数最多的那条线. 给定一个点集vectorp和点集的大小n,没有两个点的横坐标相等的情况,请返回一个vec ...

  10. hdu 5057 Argestes and Sequence (数状数组+离线处理)

    题意: 给N个数.a[1]....a[N]. M种操作: S X Y:令a[X]=Y Q L R D P:查询a[L]...a[R]中满足第D位上数字为P的数的个数 数据范围: 1<=T< ...