一文看懂QT中子窗口如何向父窗口傳遞數據信號

前言:

       在使用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);
}

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章