QT之静态函数发送信号
⼀、简介
由于博主本⼈是初学者对QT的机制不了解,所以遇到了⼀个⽐较⼤的坑,特此记录⼀下。我遇到的问题是⽆法在静态函数中向另外⼀个类发送信号。解决办法:先将信号发送给同类中的普通函数,然后在从普通函数中发送信号给外部类。
⼆、C与C++中static的⽤法
这⾥不是介绍QT静态函数信号的发送吗,和static的⽤法有什么联系,因为在编写代码中会出现静态成员⽆法访问普通成员的错误,这⾥我复制了菜鸟教程的图⽚。
接下来先了解⼀下static的⽤法。
static修饰的变量1. C语⾔中static的作⽤
主要有三个作⽤:隐藏性、持久性、默认值为0
隐藏性:当我们同时编译多个⽂件时,所有未加 static 前缀的全局变量和函数都具有全局可见性。
持久性:在函数内部使⽤static修饰变量时,不仅可以是变量具有隐藏性,还能增加变量⽣命。
默认初始化为 0:在静态数据区,内存中所有的字节默认值都是 0x00,其实全局变量也具备这⼀属性,因为全局变量也存储在静态数据区。
想了解具体的⽤法可以去菜鸟教程学习《》。
2. C++ 中static的作⽤
C++中使⽤static需要主要的地⽅
静态成员函数中不能调⽤⾮静态成员。
⾮静态成员函数中可以调⽤静态成员。因为静态成员属于类本⾝,在类的对象产⽣之前就已经存在了,所以在⾮静态成员函数中是可以调⽤静态成员的。
静态成员变量使⽤前必须先初始化(如 int MyClass::m_nNumber = 0;),否则会在 linker 时出错。
修饰成员变量
静态数据成员可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占⼀份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
静态数据成员是在程序开始运⾏时被分配空间,到程序结束之后才释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间。
静态数据成员可以被初始化,但是只能在类体外进⾏初始化,若未对静态数据成员赋初值,则编译器会⾃动为其初始化为 0。
静态数据成员既可以通过对象名引⽤,也可以通过类名引⽤。
修饰成员函数
静态成员函数和静态数据成员⼀样,他们都属于类的静态成员,⽽不是对象成员。
⾮静态成员函数有 this 指针,⽽静态成员函数没有 this 指针。
静态成员函数主要⽤来⽅位静态数据成员⽽不能访问⾮静态成员。
想了解具体的⽤法可以去菜鸟教程学习《》。
三、程序源码
ClassA.h ⽂件
#ifndef CLASSA_H
#define CLASSA_H
#include <QObject>
#include <iostream>
class ClassA : public QObject
{
Q_OBJECT
public:
ClassA();
~ClassA();
static void SignalGeneration();    //静态函数,信号将从此函数发⽣
private:
static ClassA *myClassA;    //它在内存中只占⼀份空间
signals:
void SigExternal(QString str);      //向外部的类发送信号
void SigInsideDelier(char *str);      //发送信号到此类的信号槽
private slots:
void SlotInsideDelier(char *str);    //内部槽⽤于响应内部信号
};
#endif // CLASSA_H
ClassA.cpp⽂件
#include "ClassA.h"
ClassA *ClassA::myClassA = NULL;    // 静态成员变量使⽤前必须先初始化,否则使⽤是会提⽰变量未定义ClassA::ClassA()
{
myClassA = this;
connect(this, &ClassA::SigInsideDelier, [this](char *str)
{
emit SlotInsideDelier(str);
});
}
void ClassA::SignalGeneration()
{
const char *str = "信号⽣产成功";
emit myClassA->SigInsideDelier((char *)str);
}
void ClassA::SlotInsideDelier(char *str)
{
emit SigExternal(QString(str));
}
ClassA::~ClassA()
{
}
widget.h⽂件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "ClassA.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void classA_msg(QString str);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp⽂件
#include "widget.h"
#include "ui_widget.h"
#include <iostream>
#include "ClassA.h"
using namespace std;
ClassA *classA;
Widget::Widget(QWidget *parent)
: QWidget(parent)
,
ui(new Ui::Widget)
{
classA = new ClassA();
connect(classA, SIGNAL(SigExternal(QString)), this, SLOT(classA_msg(QString)));    //注意这⾥传递信号必须使⽤QString不能使⽤char *,否则接收数据会异常,具体原因未知    ui->setupUi(this);
}
Widget::~Widget()
{
delete classA;
delete ui;
}
void Widget::on_pushButton_clicked()
{
ClassA::SignalGeneration();
}
void Widget::classA_msg(QString str)
{
ui->plainTextEdit->appendPlainText(str);
}
程序界⾯
四、运⾏测试
参考⽂献
C 语⾔中 static 的作⽤:
C/C++ 中 static 的⽤法全局变量与局部变量:Qt知识点梳理 —— 静态函数发送信号:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。