前言:
在使用QT進行界面開發時,經常會出現父窗口和子窗口進行數據交互的情況。
比方說,單擊父窗口上的一個控件,子窗口發生一些動作。或者單擊子窗口上的一個控件,父窗口發生一些動作。
父窗口向子窗口傳遞數據較簡單,單擊父窗口上的控制時,直接使用槽函數調用子窗口的成員函數,然後傳遞參數即可,執行相應的動作即可。
但單擊子窗口時,向父窗口傳遞參數並調用父窗口執行一些操作,需要通過信號與槽函數來完成。
解決思路:
在子窗口類裏面定義個信號,父窗口類裏面定義個槽函數。
示例:
下面通過一個簡單的case進行說明。
1、創建主界面,通過design新建一個主界面程序,拖進去一個 Line Edit控件,用來顯示所傳遞的數據。父窗口類名爲CParent,Line Edit對象名爲mopShowData.
2、創建子界面,使用design設計界面,拖進去了個Push Button控制,用來作爲傳遞參數的按鈕。子界面類名爲CChild,發送數據對應的Push Button對象名爲mopBtnSendData.
3、在子界面CChild類裏面添加一個mvsigSendData的信號,用來發送信號給主界面,信號函數不需要實現。同時在子界面CChild類裏面再創建一個mopBtnSendData對應的槽函數,並在初始化CChild類裏面添加connect,用來連接發送按鈕與槽函數,代碼如下:
// CChild.h文件CChild類裏面添加如下:
class CChild : public QWidget
{
...
public:
signals:
void mvsigSendData(QString sData); // 發送數據信號給主界面
private slots:
void mvslotSendData(); // 響應mopBtnSendData按鈕
...
};
// CChild.cpp文件
// 構造函數:
CChild::CChild(QWidget *parent)
: QWidget(parent)
{
ui = new Ui::CChild();
ui->setupUi(this);
// 關聯銨鈕與槽函數
connect(ui->mopBtnSendData, SIGNAL(clicked()), this, SLOT(mvslotSendData()));
}
// mopBtnSendData對應的槽函數
void CChild::mvslotSendData()
{
QString sdata = "data";
emit mvsigSendData(sdata);
}
4、在主界面CParent類添加子界面窗口成員mopChild,添加接收信號槽函數 mvslotReceiveData,並在CParent的構造函數中完成mopChild的初始化,以及建立子界面窗口信號與mvslotReceiveData關連,代碼如下:
// CParent.h
class CChild;
class CParent : public QMainWindow
{
...
public:
public slots:
void mvslotReceiveData(QString sData); // 接收數據槽函數
private:
Ui::CParentClass ui; // 設計ui
CChild *mopChild; // 子界面對象
...
};
// CParent.cpp
// 包含頭文件
#include "CChild.h"
#include "CParent.h"
// 構造函數
CParent::CParent(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
// 初始化子界面並顯示
mopChild = new CChild;
mopChild->show();
// 關聯子界面信號與mvslotReceiveData槽函數
connect(mopChild, SIGNAL(mvsigSendData(QString)), this, SLOT(mvslotReceiveData(QString)));
}
// 槽函數
void CParent::mvslotReceiveData(QString sData)
{
// 接收數據並使用Line Edit顯示
ui.mopShowData->setText(sData);
return;
}
5、實現效果:
下附完整代碼:
//******************************************************************************
// Copyright (C) 2020, SanTang Technologies
//
//******************************************************************************
// File Name : CParent.h
// Version : 1.0
// Author : J.feng
// Created : 2020-05-05
// Description : CParent
// History :
//******************************************************************************
#ifndef __CPARENT_H__
#define __CPARENT_H__
#include <QtWidgets/QMainWindow>
#include "ui_CParent.h"
class CChild;
class CParent : public QMainWindow
{
Q_OBJECT
public:
CParent(QWidget *parent = Q_NULLPTR);
public:
public slots:
void mvslotReceiveData(QString sData); // 接收數據槽函數
private:
Ui::CParentClass ui; // 設計ui
CChild *mopChild; // 子界面對象
};
#endif // __CPARENT_H__
//******************************************************************************
// Copyright (C) 2020, SanTang Technologies
//
//******************************************************************************
// File Name : CParent.cpp
// Version : 1.0
// Author : J.feng
// Created : 2020-05-05
// Description : CParent
// History :
//******************************************************************************
// 包含頭文件
#include "CChild.h"
#include "CParent.h"
// 構造函數
CParent::CParent(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
mopChild = new CChild;
mopChild->show();
// 關鍵子界面信號與mvslotReceiveData槽函數
connect(mopChild, SIGNAL(mvsigSendData(QString)), this, SLOT(mvslotReceiveData(QString)));
}
// 槽函數
void CParent::mvslotReceiveData(QString sData)
{
// 接收數據並使用Line Edit顯示
ui.mopShowData->setText(sData);
return;
}
//******************************************************************************
// Copyright (C) 2020, SanTang Technologies
//
//******************************************************************************
// File Name : CChild.h
// Version : 1.0
// Author : J.feng
// Created : 2020-05-05
// Description : CChild
// History :
//******************************************************************************
#ifndef __CCHILD_H__
#define __CCHILD_H__
#include <QString>
#include <QWidget>
namespace Ui { class CChild; };
class CChild : public QWidget
{
Q_OBJECT
public:
CChild(QWidget *parent = Q_NULLPTR); // 構造函數
~CChild(); // 析構函數
public:
signals:
void mvsigSendData(QString sData); // 發送數據信號給主界面
private slots:
void mvslotSendData(); // 響應mopBtnSendData按鈕
private:
Ui::CChild *ui; // 界面設計ui
};
#endif // __CCHILD_H__
//******************************************************************************
// Copyright (C) 2020, SanTang Technologies
//
//******************************************************************************
// File Name : CChild.cpp
// Version : 1.0
// Author : J.feng
// Created : 2020-05-05
// Description : CChild
// History :
//******************************************************************************
#include "CChild.h"
#include "ui_CChild.h"
CChild::CChild(QWidget *parent)
: QWidget(parent)
{
ui = new Ui::CChild();
ui->setupUi(this);
connect(ui->mopBtnSendData, SIGNAL(clicked()), this, SLOT(mvslotSendData()));
}
CChild::~CChild()
{
delete ui;
}
// 關
void CChild::mvslotSendData()
{
QString sdata = "data";
emit mvsigSendData(sdata);
}