赞
踩
- 1.1.传递方法有:
- 1)全局变量: 不建议
- 2)信号槽: 在窗体内传递信号比较有优势,不建议多用。窗口之间相互传递数据容易被绕晕
- 具体原因参考https://blog.csdn.net/wb175208/article/details/104724389/
- 3)利用成员函数直接修改:方便,易懂建议窗口间相互传递采用
- 4)利用类接口:比较高大上,多封装了个类接口
-
- 1.2.函数:
- QObject::connect(const QObject *sender, const char *signal,
- const QObject *receiver, const char *method,
- Qt::ConnectionType type = Qt::AutoConnection)
- 参数:
- sender: 信号的发送者
- signal: 发送者的函数(信号)
- receiver:信号的接受者
- method: 信号接受者函数(槽函数)
- connect: 通常不用并且connect的用法形式较多
-
- 例如:
- //点击pushbutton按钮调用当前窗口的ShowSubDialog函数
- connect(ui->pushButton,&QPushButton::released,this,&MainWindow::ShowSubDialog);
-
- //上面在进行有参数信号槽传递时不方便用下面
- connect(&SD,SIGNAL(SendData(QString)),this,SLOT(GetData(QString)));

- 1.3.数据的传递
- 1)信号槽:主窗口调用子窗口是很容易的主要步骤如下:
- a)主窗口类头文件:include“子窗体头文件”(子窗口头文件就不要include主窗口)
- b)主窗口类头文件:定义一私有变量(一般子窗口类指针 Dlg *pDlg;)
- c)主窗口类头文件:定义接受信号槽函数
- private slots:GetData(QString str)
- void MainWindow::GetData(QString str){ui->label->setText(str);this->show();SD.hide();}
-
- d)主函数类初始化中:将子窗口对象、信号等connect一下
- connect(pDlg,SIGNAL(SendData(QString)),this,SLOT(GetData(QString)));
-
- a)子窗体类头文件定义信号:
- signals:void SendData(QString);(仅声明不定义,如有参数仅有类型无参数名)
- b)子窗体类头文件定义槽函数:
- private slots:void SendSlot(QString str);
- void SubDialog::SendSlot(){emit SendData(ui->lineEdit->text());}
- c)子窗体类初始化中关联具体的事件如
- connect(ui->pushButton,&QPushButton::released,this,&SubDialog::SendSlot);
-
- 总结:
- 其核心是在子窗口中定义信号函数,发射emit信号函数
- 在主窗口函数中对子窗口对象、信号函数、与主窗口的函数做connect

- 2)利用成员函数直接修改
- a)主窗口类头文件:include“子窗体头文件”(子窗口头文件就不要include主窗口)
- b)主窗口类头文件:定义一私有变量(一般子窗口类指针 Dlg *pDlg;)
-
- a)子窗体类定义public成员函数:要修改对象的读写方法
- public:QString get_lineEdit();
- void set_lineEdit(QString str);
- QString Dlg::get_lineEdit(){return ui.lineEdit->text();}
- void Dlg::set_lineEdit(QString str){ui.lineEdit->setText(str);}
-
- 3)定义接口:
- 主界面基础接口类,子对话框定义基类指针
- 1.4.备注:
- Qt进程间通信与同步
- 通过QFile内存映射文件来共享内存达到进程间通信的效果。同时利用QSystemSemaphore来实现进程同步
-
- 多窗口通信,如窗口类对象之间互相包含,则可直接开放public接口调用,
- 不过,很多情况下主窗口和子窗口之间要做到异步消息通信,就必须依赖到跨窗口的信号槽
- 2.实例:
- 实例1:信号槽进行通信
-
- //子对话框通过信号槽的方式传给主窗口
- //Dlg1.h 主画面
- #pragma once
-
- #include <QtWidgets/QMainWindow>
- #include "ui_Dlg1.h"
-
- class Dlg2;
-
- class Dlg1 : public QMainWindow {
- Q_OBJECT
-
- public:
- Dlg1(QWidget *parent = Q_NULLPTR);
-
- private slots:
- void openDlg2Btn_clecked();
- void str_signal_slot(QString str);
-
- private:
- Ui::Dlg1Class ui;
-
-
- private:
- void init();
- Dlg2* pDlg2 = nullptr;
- };

- //Dlg1.cpp
- #include "Dlg1.h"
- #include "Dlg2.h"
-
- Dlg1::Dlg1(QWidget *parent)
- : QMainWindow(parent) {
- ui.setupUi(this);
- init();
- }
-
- void Dlg1::init() {
- pDlg2 = new Dlg2;
- connect(ui.openDlg2Btn, SIGNAL(clicked()), this, SLOT(openDlg2Btn_clecked()));
- connect(pDlg2, SIGNAL(str_signal(QString)), this, SLOT(str_signal_slot(QString)));
- }
-
- void Dlg1::openDlg2Btn_clecked() {
- pDlg2->show();
- }
-
- void Dlg1::str_signal_slot(QString str) {
- ui.label->setText(str);
- }

- //子对话框:dlg2.h
- #pragma once
-
- #include <QWidget>
- #include "ui_Dlg2.h"
-
- class Dlg2 : public QWidget {
- Q_OBJECT
-
- public:
- Dlg2(QWidget *parent = Q_NULLPTR);
- ~Dlg2();
-
- private:
- void init();
-
- private slots:
- void send_str_slot();
- signals:
- void str_signal(QString);
-
- private:
- Ui::Dlg2 ui;
- };

- //dlg2.cpp
- #include "Dlg2.h"
-
- Dlg2::Dlg2(QWidget *parent)
- : QWidget(parent) {
- ui.setupUi(this);
- init();
- }
-
- Dlg2::~Dlg2() {}
-
- void Dlg2::init() {
- connect(ui.send_strBtn, SIGNAL(clicked()), this, SLOT(send_str_slot()));
- }
-
- void Dlg2::send_str_slot() {
- QString str = ui.lineEdit->text();
- emit str_signal(str);
- }

实例2:使用接口类
- //需要添加第三个类,也就是接口类,这个类的目的就是为了传递参数的
- //BaseClass.h
- #pragma once
- #include <QString>
-
- class BaseClass {
- public:
- BaseClass();
- ~BaseClass();
- virtual void get_Data(QString str);
- };
-
- //BaseClass.cpp
- #include "BaseClass.h"
-
- BaseClass::BaseClass() {}
- BaseClass::~BaseClass() {}
- void BaseClass::get_Data(QString str) {}

- //以上也可定义为:
- class BaseClass {
- public:
- virtual ~BaseClass()=0;
- virtual void get_Data(QString str)=0;
- };
- //然后让第一个界面类继承这个类,并且实现里面的虚函数:
- //Dlg1.h
- #pragma once
-
- #include <QtWidgets/QMainWindow>
- #include "ui_Dlg1.h"
- #include "BaseClass.h"
-
- class Dlg2;
-
- class Dlg1 : public QMainWindow, public BaseClass {
- Q_OBJECT
-
- public:
- Dlg1(QWidget *parent = Q_NULLPTR);
- void get_Data(QString str)override;
- private:
- void init();
-
- private slots:
- void openDlg2Btn_clecked();
- private:
- Ui::Dlg1Class ui;
- Dlg2* pDlg2 = nullptr;
- };

- //Dlg1.cpp
- #include "Dlg1.h"
- #include "Dlg2.h"
-
- Dlg1::Dlg1(QWidget *parent): QMainWindow(parent) {ui.setupUi(this);init();}
- void Dlg1::get_Data(QString str) {ui.label->setText(str);}
-
- void Dlg1::init() {
- connect(ui.openDlg2Btn, SIGNAL(clicked()), this, SLOT(openDlg2Btn_clecked()));
- pDlg2 = new Dlg2;
- pDlg2->set_pBase(this);
- }
-
- void Dlg1::openDlg2Btn_clecked() {pDlg2->show();}
- //第二个界面类保存这个接口:
- //Dlg2.h
- #pragma once
-
- #include <QWidget>
- #include "ui_Dlg2.h"
-
- class BaseClass;
-
- class Dlg2 : public QWidget {
- Q_OBJECT
-
- public:
- Dlg2(QWidget *parent = Q_NULLPTR);
- ~Dlg2();
- void set_pBase(BaseClass* pBase);
- private:
- void init();
-
- private slots:
- void dlg2_send_Data();
-
- private:
- Ui::Dlg2 ui;
- BaseClass* _pBase = nullptr;
- };

- #include "Dlg2.h"
- #include "BaseClass.h"
-
- Dlg2::Dlg2(QWidget *parent): QWidget(parent) {ui.setupUi(this);init();}
- Dlg2::~Dlg2() {}
-
- void Dlg2::set_pBase(BaseClass* pBase) {_pBase = pBase;}
- void Dlg2::init() {connect(ui.send_data_Btn, SIGNAL(clicked()), this, SLOT(dlg2_send_Data()));}
-
- void Dlg2::dlg2_send_Data() {
- QString str = ui.lineEdit->text();
- if (_pBase!=nullptr)_pBase->get_Data(str);
-
- }
-
- 完成,虽然代码多但结构清晰!实现相同功能呢!利用C++特性

- 实例3:完整实例
- //Dlg1.h
- #pragma once
-
- #include <QtWidgets/QMainWindow>
- #include "ui_Dlg1.h"
- #include"Dlg2.h"
-
- class Dlg1 : public QMainWindow{
- Q_OBJECT
-
- public:
- Dlg1(QWidget *parent = Q_NULLPTR);
- void message(QString str);
- private:
- Ui::Dlg1Class ui;
-
- private slots:
- void openDlg2Btn_clecked();
- //1.主窗口接受主窗口数据:定义接受子窗口的信号的函数
- void get_dlg2_str_signal(QString str);
-
- private:
- void init();
- Dlg2* pDlg2 = nullptr;
-
- private slots:
- //2.主窗口修改子窗口数据:
- void on_lineEdit_textChanged(QString str);
- };

- //Dlg1.cpp
- #include "Dlg1.h"
- #include <qmessagebox.h>
-
- Dlg1::Dlg1(QWidget *parent): QMainWindow(parent){ ui.setupUi(this); init();}
-
- void Dlg1::init() {
- pDlg2 = new Dlg2;
- connect(ui.openDlg2Btn, SIGNAL(clicked()), this, SLOT(openDlg2Btn_clecked()));
-
- //1.1.主窗口接受子窗口数据:将子窗口信号绑定到接受的函数:
- connect(pDlg2, SIGNAL(dlg2_str_signal(QString)), this, SLOT(get_dlg2_str_signal(QString)));
- }
-
- void Dlg1::openDlg2Btn_clecked() {pDlg2->show();}
-
- //1.2.主窗口接受子窗口数据:定义接受子窗口的信号的函数
- void Dlg1::get_dlg2_str_signal(QString str) {ui.label->setText(str);}
-
- //2.主窗口修改子窗口数据:
- void Dlg1::on_lineEdit_textChanged(QString str) {
- pDlg2->set_lineEdit(str);
- QString s = pDlg2->get_lineEdit();
- message("Message:=" + s);
- }
-
- void Dlg1::message(QString str) {
- int k = QMessageBox::information(this, "msg title:", str, QMessageBox::Ok,
- QMessageBox::Cancel, QMessageBox::Yes); //ok,cancle,yes三个按钮
- }

- //Dlg2.h
- #pragma once
-
- #include <QWidget>
- #include "ui_Dlg2.h"
-
- class Dlg2 : public QWidget{
- Q_OBJECT
-
- public:
- Dlg2(QWidget *parent = Q_NULLPTR);
- ~Dlg2();
- //2.1.主窗口修改主窗口数据:定义要修改数据的函数
- void set_lineEdit(QString str);
- QString get_lineEdit();
- private:
- Ui::Dlg2 ui;
-
- private:
- void init();
-
- //1.1.子窗口向父窗口发送数据:定义一个信号及一个发送信号的函数
- //然后在主窗口接受这个信号
- signals:
- void dlg2_str_signal(QString );
-
- private slots:
- void dlg2_send_data_to_dlg1();
- };

- //Dlg2.cpp
- #include "Dlg2.h"
-
- Dlg2::Dlg2(QWidget *parent): QWidget(parent){ui.setupUi(this); init();}
- Dlg2::~Dlg2(){}
-
- //1.1.子窗口向父窗口发送数据:单击按键将数据发送
- void Dlg2::init() { connect(ui.send_strBtn, SIGNAL(clicked()), this, SLOT(dlg2_send_data_to_dlg1()));}
-
- //1.2.发送信号槽:
- void Dlg2::dlg2_send_data_to_dlg1() {QString str = ui.lineEdit->text();emit dlg2_str_signal(str);}
-
- //2.1.主窗口修改主窗口数据:定义要修改数据的函数
- void Dlg2::set_lineEdit(QString str) {ui.lineEdit->setText(str);}
- QString Dlg2::get_lineEdit() { return ui.lineEdit->text(); }
- //ui_Dlg1.h
- #ifndef UI_DLG1_H
- #define UI_DLG1_H
-
- #include <QtCore/QVariant>
- #include <QtWidgets/QApplication>
- #include <QtWidgets/QLabel>
- #include <QtWidgets/QLineEdit>
- #include <QtWidgets/QMainWindow>
- #include <QtWidgets/QMenuBar>
- #include <QtWidgets/QPushButton>
- #include <QtWidgets/QStatusBar>
- #include <QtWidgets/QToolBar>
- #include <QtWidgets/QWidget>
-
- QT_BEGIN_NAMESPACE
-
- class Ui_Dlg1Class
- {
- public:
- QWidget *centralWidget;
- QPushButton *openDlg2Btn;
- QLabel *label;
- QPushButton *sendBtn;
- QLineEdit *lineEdit;
- QMenuBar *menuBar;
- QToolBar *mainToolBar;
- QStatusBar *statusBar;
-
- void setupUi(QMainWindow *Dlg1Class)
- {
- if (Dlg1Class->objectName().isEmpty())
- Dlg1Class->setObjectName(QString::fromUtf8("Dlg1Class"));
- Dlg1Class->resize(600, 400);
- centralWidget = new QWidget(Dlg1Class);
- centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
- openDlg2Btn = new QPushButton(centralWidget);
- openDlg2Btn->setObjectName(QString::fromUtf8("openDlg2Btn"));
- openDlg2Btn->setGeometry(QRect(200, 90, 75, 23));
- label = new QLabel(centralWidget);
- label->setObjectName(QString::fromUtf8("label"));
- label->setGeometry(QRect(300, 90, 71, 21));
- sendBtn = new QPushButton(centralWidget);
- sendBtn->setObjectName(QString::fromUtf8("sendBtn"));
- sendBtn->setGeometry(QRect(200, 130, 75, 23));
- lineEdit = new QLineEdit(centralWidget);
- lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
- lineEdit->setGeometry(QRect(300, 130, 61, 20));
- Dlg1Class->setCentralWidget(centralWidget);
- menuBar = new QMenuBar(Dlg1Class);
- menuBar->setObjectName(QString::fromUtf8("menuBar"));
- menuBar->setGeometry(QRect(0, 0, 600, 23));
- Dlg1Class->setMenuBar(menuBar);
- mainToolBar = new QToolBar(Dlg1Class);
- mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
- Dlg1Class->addToolBar(Qt::TopToolBarArea, mainToolBar);
- statusBar = new QStatusBar(Dlg1Class);
- statusBar->setObjectName(QString::fromUtf8("statusBar"));
- Dlg1Class->setStatusBar(statusBar);
-
- retranslateUi(Dlg1Class);
-
- QMetaObject::connectSlotsByName(Dlg1Class);
- } // setupUi
-
- void retranslateUi(QMainWindow *Dlg1Class)
- {
- Dlg1Class->setWindowTitle(QCoreApplication::translate("Dlg1Class", "Dlg1", nullptr));
- openDlg2Btn->setText(QCoreApplication::translate("Dlg1Class", "openDlg2Btn", nullptr));
- label->setText(QCoreApplication::translate("Dlg1Class", "TextLabel", nullptr));
- sendBtn->setText(QCoreApplication::translate("Dlg1Class", "sendBtn", nullptr));
- } // retranslateUi
-
- };
-
- namespace Ui {
- class Dlg1Class: public Ui_Dlg1Class {};
- } // namespace Ui
-
- QT_END_NAMESPACE
-
- #endif // UI_DLG1_H

- //ui_Dig2.h
- #ifndef UI_DLG2_H
- #define UI_DLG2_H
-
- #include <QtCore/QVariant>
- #include <QtWidgets/QApplication>
- #include <QtWidgets/QLineEdit>
- #include <QtWidgets/QPushButton>
- #include <QtWidgets/QWidget>
-
- QT_BEGIN_NAMESPACE
-
- class Ui_Dlg2
- {
- public:
- QLineEdit *lineEdit;
- QPushButton *send_strBtn;
-
- void setupUi(QWidget *Dlg2)
- {
- if (Dlg2->objectName().isEmpty())
- Dlg2->setObjectName(QString::fromUtf8("Dlg2"));
- Dlg2->resize(400, 300);
- lineEdit = new QLineEdit(Dlg2);
- lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
- lineEdit->setGeometry(QRect(110, 130, 113, 20));
- send_strBtn = new QPushButton(Dlg2);
- send_strBtn->setObjectName(QString::fromUtf8("send_strBtn"));
- send_strBtn->setGeometry(QRect(120, 90, 75, 23));
-
- retranslateUi(Dlg2);
-
- QMetaObject::connectSlotsByName(Dlg2);
- } // setupUi
-
- void retranslateUi(QWidget *Dlg2)
- {
- Dlg2->setWindowTitle(QCoreApplication::translate("Dlg2", "Dlg2", nullptr));
- send_strBtn->setText(QCoreApplication::translate("Dlg2", "send_strBtn", nullptr));
- } // retranslateUi
-
- };
-
- namespace Ui {
- class Dlg2: public Ui_Dlg2 {};
- } // namespace Ui
-
- QT_END_NAMESPACE
-
- #endif // UI_DLG2_H

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。