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