传递参数和多窗口设计后来发现有一个更简单的方法实现(用QDialog实现):传送门
本文基于已有工程基础上进行:QT:多窗口设计(主窗口点击按钮打开子窗口)
一、子窗口向主窗口传递信息
窗口UI界面设计:
主窗口包含一个LineEdit、一个pushButton按钮(用于打开子窗口,该按钮是之前已经设计好的)
子窗口包含一个LineEdit、一个pushButton按钮(用于发送信息到主窗口)
接下来根据信号与槽的机制,要实现子窗口向主窗口传递信息分为三步:
(1)子窗口发送信号 (2)主窗口接收信号的槽函数(3)连接子窗口信号与主窗口槽函数
---------------------------------------------------------------------------------------------------------------------------------
(1)子窗口发送信号
1.在childwindow.h内加入一个新的信号:
signals:
void sendData(QString data); //当点击发送时发送QString data信号
2.子窗口设计界面右键按钮后,点击转到槽、clicked()、再补充槽函数
void childwindow::on_pushButton_clicked() //点击发送按钮
{
emit sendData(ui->lineEdit->text()); //把在lineEdit获取到的文本发送
}
(2)主窗口接收信号的槽函数
1.在mainwindow.h的private slots内声明信号接收的槽函数:
private slots:
void receiveData(QString data); //接收子窗口发送的data信号,类型为QString
2.在mainwindow.cpp内写好信号接收的槽函数:
void MainWindow::receiveData(QString data)
{
ui->lineEdit->setText(data); //将接收到的data信号设置为lineEdit的文本
}
(3)连接子窗口信号与主窗口槽函数
连接信号与槽的connect语法如下:
connect(sender, &SenderClass::signalName, receiver, &ReceiverClass::slotName);
connect(发送者, &发送者类::信号, 接收者, &接收者类::槽函数);
//连接信号与槽(子窗口发送消息到主窗口)
connect(childwindow_ui, &childwindow::sendData,this,&MainWindow::receiveData);
因为要在子窗口打开时建立连接,所以connect放在打开子窗口按钮的槽函数内,具体代码如下:
void MainWindow::on_pushButton_clicked()
{
if(!childwindow_ui)
{
this->setEnabled(false);//禁用主窗口
childwindow_ui = new childwindow(this);
connect(childwindow_ui, &childwindow::closed,this,&MainWindow::childwindow_close); //连接主窗口close信号到主窗口槽函数
//***********************放在这里**********************//
connect(childwindow_ui, &childwindow::sendData,this,&MainWindow::receiveData); //连接信号与槽(子窗口发送消息到主窗口)
//****************************************************//
childwindow_ui -> show();
}
}
(4)效果演示
打开子窗口后,在子窗口输入文字再点击发送,信息会发送到主窗口并显示出来。
(5)完整代码
mainwindow.h代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "childwindow.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked() ; //点击打开子窗口按钮的槽函数
void childwindow_close() ; //关闭子窗口函数(关闭窗口时指针将置空)
void receiveData(QString data); //接收select发送的data信号,类型为QString
private:
Ui::MainWindow *ui;
childwindow *childwindow_ui = nullptr;
};
#endif // MAINWINDOW_H
childwindow.h代码
#ifndef CHILDWINDOW_H
#define CHILDWINDOW_H
#include <QMainWindow>
#include <QCloseEvent>
namespace Ui {
class childwindow;
}
class childwindow : public QMainWindow
{
Q_OBJECT
public:
explicit childwindow(QWidget *parent = nullptr);
~childwindow();
signals:
void closed(); // 当窗口关闭时发送的信号
void sendData(QString chip); //当点击OK时发送的芯片型号信号********************************
protected:
void closeEvent(QCloseEvent *event) override; // 重写closeEvent
private slots:
void on_pushButton_clicked();
private:
Ui::childwindow *ui;
};
#endif // CHILDWINDOW_H
mainwindow.cpp代码
#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
if(!childwindow_ui)
{
this->setEnabled(false);//禁用主窗口
childwindow_ui = new childwindow(this);
connect(childwindow_ui, &childwindow::closed,this,&MainWindow::childwindow_close); //连接主窗口close信号到主窗口槽函数
connect(childwindow_ui, &childwindow::sendData,this,&MainWindow::receiveData); //连接信号与槽(子窗口发送消息到主窗口)
childwindow_ui -> show();
}
}
void MainWindow::receiveData(QString data)
{
ui->lineEdit->setText(data); //将接收到的data信号设置为lineEdit的文本
}
void MainWindow::childwindow_close()//当子窗口关闭时,将指针置空并启用主窗口
{
childwindow_ui = nullptr;
this->setEnabled(true);
}
childwindow.cpp代码
#include "childwindow.h"
#include "ui_childwindow.h"
childwindow::childwindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::childwindow)
{
ui->setupUi(this);
}
childwindow::~childwindow()
{
delete ui;
}
void childwindow::closeEvent(QCloseEvent *event)
{
emit closed(); // 发射关闭信号
QWidget::closeEvent(event); // 继续默认的关闭处理
}
void childwindow::on_pushButton_clicked() //点击发送按钮
{
emit sendData(ui->lineEdit->text()); //把在lineEdit获取到的文本发送
}
二、主窗口向子窗口传递信息
根据信号与槽的机制同理可得,要反过来实现主窗口向子窗口传递信息,也分为三步:
(1)主窗口发送信号 (2)子窗口接收信号的槽函数(3)连接主窗口信号与子窗口槽函数
这里原理一致,就不进行详细说明了。