当前位置:   article > 正文

VS2017 QT 两个窗口之间相互传递数据 tcy_vs2017 qt 两个窗口之间相互传递数据 副窗口传值给子窗口

vs2017 qt 两个窗口之间相互传递数据 副窗口传值给子窗口
  1. 1.1.传递方法有:
  2. 1)全局变量: 不建议
  3. 2)信号槽: 在窗体内传递信号比较有优势,不建议多用。窗口之间相互传递数据容易被绕晕
  4. 具体原因参考https://blog.csdn.net/wb175208/article/details/104724389/
  5. 3)利用成员函数直接修改:方便,易懂建议窗口间相互传递采用
  6. 4)利用类接口:比较高大上,多封装了个类接口
  7. 1.2.函数:
  8. QObject::connect(const QObject *sender, const char *signal,
  9. const QObject *receiver, const char *method,
  10. Qt::ConnectionType type = Qt::AutoConnection)
  11. 参数:
  12. sender: 信号的发送者
  13. signal: 发送者的函数(信号)
  14. receiver:信号的接受者
  15. method: 信号接受者函数(槽函数)
  16. connect: 通常不用并且connect的用法形式较多
  17. 例如:
  18. //点击pushbutton按钮调用当前窗口的ShowSubDialog函数
  19. connect(ui->pushButton,&QPushButton::released,this,&MainWindow::ShowSubDialog);
  20. //上面在进行有参数信号槽传递时不方便用下面
  21. connect(&SD,SIGNAL(SendData(QString)),this,SLOT(GetData(QString)));
  1. 1.3.数据的传递
  2. 1)信号槽:主窗口调用子窗口是很容易的主要步骤如下:
  3. a)主窗口类头文件:include“子窗体头文件”(子窗口头文件就不要include主窗口)
  4. b)主窗口类头文件:定义一私有变量(一般子窗口类指针 Dlg *pDlg;)
  5. c)主窗口类头文件:定义接受信号槽函数
  6. private slots:GetData(QString str)
  7. void MainWindow::GetData(QString str){ui->label->setText(str);this->show();SD.hide();}
  8. d)主函数类初始化中:将子窗口对象、信号等connect一下
  9. connect(pDlg,SIGNAL(SendData(QString)),this,SLOT(GetData(QString)));
  10. a)子窗体类头文件定义信号:
  11. signals:void SendData(QString);(仅声明不定义,如有参数仅有类型无参数名)
  12. b)子窗体类头文件定义槽函数:
  13. private slots:void SendSlot(QString str);
  14. void SubDialog::SendSlot(){emit SendData(ui->lineEdit->text());}
  15. c)子窗体类初始化中关联具体的事件如
  16. connect(ui->pushButton,&QPushButton::released,this,&SubDialog::SendSlot);
  17. 总结:
  18. 其核心是在子窗口中定义信号函数,发射emit信号函数
  19. 在主窗口函数中对子窗口对象、信号函数、与主窗口的函数做connect
  1. 2)利用成员函数直接修改
  2. a)主窗口类头文件:include“子窗体头文件”(子窗口头文件就不要include主窗口)
  3. b)主窗口类头文件:定义一私有变量(一般子窗口类指针 Dlg *pDlg;)
  4. a)子窗体类定义public成员函数:要修改对象的读写方法
  5. public:QString get_lineEdit();
  6. void set_lineEdit(QString str);
  7. QString Dlg::get_lineEdit(){return ui.lineEdit->text();}
  8. void Dlg::set_lineEdit(QString str){ui.lineEdit->setText(str);}
  9. 3)定义接口:
  10. 主界面基础接口类,子对话框定义基类指针
  1. 1.4.备注:
  2. Qt进程间通信与同步
  3. 通过QFile内存映射文件来共享内存达到进程间通信的效果。同时利用QSystemSemaphore来实现进程同步
  4. 多窗口通信,如窗口类对象之间互相包含,则可直接开放public接口调用,
  5. 不过,很多情况下主窗口和子窗口之间要做到异步消息通信,就必须依赖到跨窗口的信号槽
  1. 2.实例:
  2. 实例1:信号槽进行通信
  3. //子对话框通过信号槽的方式传给主窗口
  4. //Dlg1.h 主画面
  5. #pragma once
  6. #include <QtWidgets/QMainWindow>
  7. #include "ui_Dlg1.h"
  8. class Dlg2;
  9. class Dlg1 : public QMainWindow {
  10. Q_OBJECT
  11. public:
  12. Dlg1(QWidget *parent = Q_NULLPTR);
  13. private slots:
  14. void openDlg2Btn_clecked();
  15. void str_signal_slot(QString str);
  16. private:
  17. Ui::Dlg1Class ui;
  18. private:
  19. void init();
  20. Dlg2* pDlg2 = nullptr;
  21. };
  1. //Dlg1.cpp
  2. #include "Dlg1.h"
  3. #include "Dlg2.h"
  4. Dlg1::Dlg1(QWidget *parent)
  5. : QMainWindow(parent) {
  6. ui.setupUi(this);
  7. init();
  8. }
  9. void Dlg1::init() {
  10. pDlg2 = new Dlg2;
  11. connect(ui.openDlg2Btn, SIGNAL(clicked()), this, SLOT(openDlg2Btn_clecked()));
  12. connect(pDlg2, SIGNAL(str_signal(QString)), this, SLOT(str_signal_slot(QString)));
  13. }
  14. void Dlg1::openDlg2Btn_clecked() {
  15. pDlg2->show();
  16. }
  17. void Dlg1::str_signal_slot(QString str) {
  18. ui.label->setText(str);
  19. }
  1. //子对话框:dlg2.h
  2. #pragma once
  3. #include <QWidget>
  4. #include "ui_Dlg2.h"
  5. class Dlg2 : public QWidget {
  6. Q_OBJECT
  7. public:
  8. Dlg2(QWidget *parent = Q_NULLPTR);
  9. ~Dlg2();
  10. private:
  11. void init();
  12. private slots:
  13. void send_str_slot();
  14. signals:
  15. void str_signal(QString);
  16. private:
  17. Ui::Dlg2 ui;
  18. };
  1. //dlg2.cpp
  2. #include "Dlg2.h"
  3. Dlg2::Dlg2(QWidget *parent)
  4. : QWidget(parent) {
  5. ui.setupUi(this);
  6. init();
  7. }
  8. Dlg2::~Dlg2() {}
  9. void Dlg2::init() {
  10. connect(ui.send_strBtn, SIGNAL(clicked()), this, SLOT(send_str_slot()));
  11. }
  12. void Dlg2::send_str_slot() {
  13. QString str = ui.lineEdit->text();
  14. emit str_signal(str);
  15. }

 实例2:使用接口类

  1. //需要添加第三个类,也就是接口类,这个类的目的就是为了传递参数的
  2. //BaseClass.h
  3. #pragma once
  4. #include <QString>
  5. class BaseClass {
  6. public:
  7. BaseClass();
  8. ~BaseClass();
  9. virtual void get_Data(QString str);
  10. };
  11. //BaseClass.cpp
  12. #include "BaseClass.h"
  13. BaseClass::BaseClass() {}
  14. BaseClass::~BaseClass() {}
  15. void BaseClass::get_Data(QString str) {}
  1. //以上也可定义为:
  2. class BaseClass {
  3. public:
  4. virtual ~BaseClass()=0;
  5. virtual void get_Data(QString str)=0;
  6. };
  1. //然后让第一个界面类继承这个类,并且实现里面的虚函数:
  2. //Dlg1.h
  3. #pragma once
  4. #include <QtWidgets/QMainWindow>
  5. #include "ui_Dlg1.h"
  6. #include "BaseClass.h"
  7. class Dlg2;
  8. class Dlg1 : public QMainWindow, public BaseClass {
  9. Q_OBJECT
  10. public:
  11. Dlg1(QWidget *parent = Q_NULLPTR);
  12. void get_Data(QString str)override;
  13. private:
  14. void init();
  15. private slots:
  16. void openDlg2Btn_clecked();
  17. private:
  18. Ui::Dlg1Class ui;
  19. Dlg2* pDlg2 = nullptr;
  20. };
  1. //Dlg1.cpp
  2. #include "Dlg1.h"
  3. #include "Dlg2.h"
  4. Dlg1::Dlg1(QWidget *parent): QMainWindow(parent) {ui.setupUi(this);init();}
  5. void Dlg1::get_Data(QString str) {ui.label->setText(str);}
  6. void Dlg1::init() {
  7. connect(ui.openDlg2Btn, SIGNAL(clicked()), this, SLOT(openDlg2Btn_clecked()));
  8. pDlg2 = new Dlg2;
  9. pDlg2->set_pBase(this);
  10. }
  11. void Dlg1::openDlg2Btn_clecked() {pDlg2->show();}
  1. //第二个界面类保存这个接口:
  2. //Dlg2.h
  3. #pragma once
  4. #include <QWidget>
  5. #include "ui_Dlg2.h"
  6. class BaseClass;
  7. class Dlg2 : public QWidget {
  8. Q_OBJECT
  9. public:
  10. Dlg2(QWidget *parent = Q_NULLPTR);
  11. ~Dlg2();
  12. void set_pBase(BaseClass* pBase);
  13. private:
  14. void init();
  15. private slots:
  16. void dlg2_send_Data();
  17. private:
  18. Ui::Dlg2 ui;
  19. BaseClass* _pBase = nullptr;
  20. };
  1. #include "Dlg2.h"
  2. #include "BaseClass.h"
  3. Dlg2::Dlg2(QWidget *parent): QWidget(parent) {ui.setupUi(this);init();}
  4. Dlg2::~Dlg2() {}
  5. void Dlg2::set_pBase(BaseClass* pBase) {_pBase = pBase;}
  6. void Dlg2::init() {connect(ui.send_data_Btn, SIGNAL(clicked()), this, SLOT(dlg2_send_Data()));}
  7. void Dlg2::dlg2_send_Data() {
  8. QString str = ui.lineEdit->text();
  9. if (_pBase!=nullptr)_pBase->get_Data(str);
  10. }
  11. 完成,虽然代码多但结构清晰!实现相同功能呢!利用C++特性

 

  1. 实例3:完整实例
  2. //Dlg1.h
  3. #pragma once
  4. #include <QtWidgets/QMainWindow>
  5. #include "ui_Dlg1.h"
  6. #include"Dlg2.h"
  7. class Dlg1 : public QMainWindow{
  8. Q_OBJECT
  9. public:
  10. Dlg1(QWidget *parent = Q_NULLPTR);
  11. void message(QString str);
  12. private:
  13. Ui::Dlg1Class ui;
  14. private slots:
  15. void openDlg2Btn_clecked();
  16. //1.主窗口接受主窗口数据:定义接受子窗口的信号的函数
  17. void get_dlg2_str_signal(QString str);
  18. private:
  19. void init();
  20. Dlg2* pDlg2 = nullptr;
  21. private slots:
  22. //2.主窗口修改子窗口数据:
  23. void on_lineEdit_textChanged(QString str);
  24. };
  1. //Dlg1.cpp
  2. #include "Dlg1.h"
  3. #include <qmessagebox.h>
  4. Dlg1::Dlg1(QWidget *parent): QMainWindow(parent){ ui.setupUi(this); init();}
  5. void Dlg1::init() {
  6. pDlg2 = new Dlg2;
  7. connect(ui.openDlg2Btn, SIGNAL(clicked()), this, SLOT(openDlg2Btn_clecked()));
  8. //1.1.主窗口接受子窗口数据:将子窗口信号绑定到接受的函数:
  9. connect(pDlg2, SIGNAL(dlg2_str_signal(QString)), this, SLOT(get_dlg2_str_signal(QString)));
  10. }
  11. void Dlg1::openDlg2Btn_clecked() {pDlg2->show();}
  12. //1.2.主窗口接受子窗口数据:定义接受子窗口的信号的函数
  13. void Dlg1::get_dlg2_str_signal(QString str) {ui.label->setText(str);}
  14. //2.主窗口修改子窗口数据:
  15. void Dlg1::on_lineEdit_textChanged(QString str) {
  16. pDlg2->set_lineEdit(str);
  17. QString s = pDlg2->get_lineEdit();
  18. message("Message:=" + s);
  19. }
  20. void Dlg1::message(QString str) {
  21. int k = QMessageBox::information(this, "msg title:", str, QMessageBox::Ok,
  22. QMessageBox::Cancel, QMessageBox::Yes); //ok,cancle,yes三个按钮
  23. }
  1. //Dlg2.h
  2. #pragma once
  3. #include <QWidget>
  4. #include "ui_Dlg2.h"
  5. class Dlg2 : public QWidget{
  6. Q_OBJECT
  7. public:
  8. Dlg2(QWidget *parent = Q_NULLPTR);
  9. ~Dlg2();
  10. //2.1.主窗口修改主窗口数据:定义要修改数据的函数
  11. void set_lineEdit(QString str);
  12. QString get_lineEdit();
  13. private:
  14. Ui::Dlg2 ui;
  15. private:
  16. void init();
  17. //1.1.子窗口向父窗口发送数据:定义一个信号及一个发送信号的函数
  18. //然后在主窗口接受这个信号
  19. signals:
  20. void dlg2_str_signal(QString );
  21. private slots:
  22. void dlg2_send_data_to_dlg1();
  23. };
  1. //Dlg2.cpp
  2. #include "Dlg2.h"
  3. Dlg2::Dlg2(QWidget *parent): QWidget(parent){ui.setupUi(this); init();}
  4. Dlg2::~Dlg2(){}
  5. //1.1.子窗口向父窗口发送数据:单击按键将数据发送
  6. void Dlg2::init() { connect(ui.send_strBtn, SIGNAL(clicked()), this, SLOT(dlg2_send_data_to_dlg1()));}
  7. //1.2.发送信号槽:
  8. void Dlg2::dlg2_send_data_to_dlg1() {QString str = ui.lineEdit->text();emit dlg2_str_signal(str);}
  9. //2.1.主窗口修改主窗口数据:定义要修改数据的函数
  10. void Dlg2::set_lineEdit(QString str) {ui.lineEdit->setText(str);}
  11. QString Dlg2::get_lineEdit() { return ui.lineEdit->text(); }
  1. //ui_Dlg1.h
  2. #ifndef UI_DLG1_H
  3. #define UI_DLG1_H
  4. #include <QtCore/QVariant>
  5. #include <QtWidgets/QApplication>
  6. #include <QtWidgets/QLabel>
  7. #include <QtWidgets/QLineEdit>
  8. #include <QtWidgets/QMainWindow>
  9. #include <QtWidgets/QMenuBar>
  10. #include <QtWidgets/QPushButton>
  11. #include <QtWidgets/QStatusBar>
  12. #include <QtWidgets/QToolBar>
  13. #include <QtWidgets/QWidget>
  14. QT_BEGIN_NAMESPACE
  15. class Ui_Dlg1Class
  16. {
  17. public:
  18. QWidget *centralWidget;
  19. QPushButton *openDlg2Btn;
  20. QLabel *label;
  21. QPushButton *sendBtn;
  22. QLineEdit *lineEdit;
  23. QMenuBar *menuBar;
  24. QToolBar *mainToolBar;
  25. QStatusBar *statusBar;
  26. void setupUi(QMainWindow *Dlg1Class)
  27. {
  28. if (Dlg1Class->objectName().isEmpty())
  29. Dlg1Class->setObjectName(QString::fromUtf8("Dlg1Class"));
  30. Dlg1Class->resize(600, 400);
  31. centralWidget = new QWidget(Dlg1Class);
  32. centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
  33. openDlg2Btn = new QPushButton(centralWidget);
  34. openDlg2Btn->setObjectName(QString::fromUtf8("openDlg2Btn"));
  35. openDlg2Btn->setGeometry(QRect(200, 90, 75, 23));
  36. label = new QLabel(centralWidget);
  37. label->setObjectName(QString::fromUtf8("label"));
  38. label->setGeometry(QRect(300, 90, 71, 21));
  39. sendBtn = new QPushButton(centralWidget);
  40. sendBtn->setObjectName(QString::fromUtf8("sendBtn"));
  41. sendBtn->setGeometry(QRect(200, 130, 75, 23));
  42. lineEdit = new QLineEdit(centralWidget);
  43. lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
  44. lineEdit->setGeometry(QRect(300, 130, 61, 20));
  45. Dlg1Class->setCentralWidget(centralWidget);
  46. menuBar = new QMenuBar(Dlg1Class);
  47. menuBar->setObjectName(QString::fromUtf8("menuBar"));
  48. menuBar->setGeometry(QRect(0, 0, 600, 23));
  49. Dlg1Class->setMenuBar(menuBar);
  50. mainToolBar = new QToolBar(Dlg1Class);
  51. mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
  52. Dlg1Class->addToolBar(Qt::TopToolBarArea, mainToolBar);
  53. statusBar = new QStatusBar(Dlg1Class);
  54. statusBar->setObjectName(QString::fromUtf8("statusBar"));
  55. Dlg1Class->setStatusBar(statusBar);
  56. retranslateUi(Dlg1Class);
  57. QMetaObject::connectSlotsByName(Dlg1Class);
  58. } // setupUi
  59. void retranslateUi(QMainWindow *Dlg1Class)
  60. {
  61. Dlg1Class->setWindowTitle(QCoreApplication::translate("Dlg1Class", "Dlg1", nullptr));
  62. openDlg2Btn->setText(QCoreApplication::translate("Dlg1Class", "openDlg2Btn", nullptr));
  63. label->setText(QCoreApplication::translate("Dlg1Class", "TextLabel", nullptr));
  64. sendBtn->setText(QCoreApplication::translate("Dlg1Class", "sendBtn", nullptr));
  65. } // retranslateUi
  66. };
  67. namespace Ui {
  68. class Dlg1Class: public Ui_Dlg1Class {};
  69. } // namespace Ui
  70. QT_END_NAMESPACE
  71. #endif // UI_DLG1_H
  1. //ui_Dig2.h
  2. #ifndef UI_DLG2_H
  3. #define UI_DLG2_H
  4. #include <QtCore/QVariant>
  5. #include <QtWidgets/QApplication>
  6. #include <QtWidgets/QLineEdit>
  7. #include <QtWidgets/QPushButton>
  8. #include <QtWidgets/QWidget>
  9. QT_BEGIN_NAMESPACE
  10. class Ui_Dlg2
  11. {
  12. public:
  13. QLineEdit *lineEdit;
  14. QPushButton *send_strBtn;
  15. void setupUi(QWidget *Dlg2)
  16. {
  17. if (Dlg2->objectName().isEmpty())
  18. Dlg2->setObjectName(QString::fromUtf8("Dlg2"));
  19. Dlg2->resize(400, 300);
  20. lineEdit = new QLineEdit(Dlg2);
  21. lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
  22. lineEdit->setGeometry(QRect(110, 130, 113, 20));
  23. send_strBtn = new QPushButton(Dlg2);
  24. send_strBtn->setObjectName(QString::fromUtf8("send_strBtn"));
  25. send_strBtn->setGeometry(QRect(120, 90, 75, 23));
  26. retranslateUi(Dlg2);
  27. QMetaObject::connectSlotsByName(Dlg2);
  28. } // setupUi
  29. void retranslateUi(QWidget *Dlg2)
  30. {
  31. Dlg2->setWindowTitle(QCoreApplication::translate("Dlg2", "Dlg2", nullptr));
  32. send_strBtn->setText(QCoreApplication::translate("Dlg2", "send_strBtn", nullptr));
  33. } // retranslateUi
  34. };
  35. namespace Ui {
  36. class Dlg2: public Ui_Dlg2 {};
  37. } // namespace Ui
  38. QT_END_NAMESPACE
  39. #endif // UI_DLG2_H

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/730700
推荐阅读
相关标签
  

闽ICP备14008679号