在学习QT的过程中不免随着项目的扩大,业务需求的增多,需要添加多个类文件便于计算。在计算的过程中就需要源文件之间的数据交互。
常用的数据交互方法有以下几种
1.通过QT独有的信号与槽机制完成数据的传送。
2.在建立对象的同时加入公有函数来访问类内私有变量。
3.在对象内部完成一系列复杂逻辑计算后通过设置返回值,在另一个源文件中新建局部/全局变量进行接受即可(方法简单不做过多概述)
首先第一种方法:
通过信号与槽进行传递,QT独有的信号与槽机制可以保证线程安全性,操作简单。例如下面创建一个Data类来完成数据的传递。
注意:Data类要想实现信号与槽必须继承QObject类,类内声明Q_OBJECT宏。
//头文件中进行声明
class Data : public QObject
{
Q_OBJECT
public:
//一般在构造函数中进行私有变量的初始化,在析构函数中进行delete操作
Data();
~Data();
void GenerateData();
signals:
void SendData(int sendnum);
private:
int m_num;
}
//源文件中进行类内实现
void Data::GenerateData()
{
int num=0;
num+=20;
//假设要传递num的值给主程序读取。
emit SendData(num);
}
接下来演示主函数的槽函数命令获取子函数的num;
//MainWindow里的部分头文件内容
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public slots:
void RecvData(int num);
private:
int m_num_2;
Data m_data;
}
//Mainwindow源文件:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
m_num_2(0)
{
ui->setupUi(this);
//可以根据需求连接信号和槽:可以是在按钮槽函数中完成数据信号和槽的绑定,也可以在MainWindow的构造中完成。这里主要是讲清楚如何进行数据传递就行,不做过多其他的讲解。
connect(m_data,&Data::SendData,this,&MainWindow::RecvData);
//调用text01
text01();
}
MainWindow::~MainWindow()
{
delete ui;
}
void text01()
{
m_Data.GenerateData;
qDebug()<<m_num_2;
}
2.由于类内的成员变量一般是设置为私有,外部命令不可调用,但类内成员函数可以访问私有成员变量。通过设计对象成员函数来获取类内的成员变量也是数据传递的一种方式。
//头文件中进行声明
class Data : public QObject
{
Q_OBJECT
public:
//一般在构造函数中进行私有变量的初始化,在析构函数中进行delete操作
Data();
~Data();
void GenerateData();
void Getnum();
signals:
void SendData(int sendnum);
private:
int m_num;
}
//源文件中进行类内实现
void Data::GenerateData()
{
int num=0;
num+=20;
m_num=num;
}
//采用引用传递
void Data::Getnum(int & _num)
{
_num=m_num;
}
MainWindow的程序如下所示:
//MainWindow里的部分头文件内容
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public slots:
void RecvData(int num);
private:
Data m_data;
}
//Mainwindow源文件:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
text01();
}
MainWindow::~MainWindow()
{
delete ui;
}
void text01()
{
m_Data.GenerateData();
int numFromData=0;
m_Data.Getnum(numFromData);
qDebug()<<numFromData;
}