一文看懂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);
}

猜你喜欢

转载自blog.csdn.net/feengg/article/details/105932699
今日推荐