QT单例类管理信号和槽函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

在QT当中,遇到主界面和多个组件槽函数绑定问题时,为了便于管理,我们可以通过单例类作为第三方来进行管理。

提示:以下是本篇文章正文内容,下面案例可供参考

一、创建单例类

SignalInstance.h

#include <QObject>

class  SignalInstance:public QObject
{
	Q_OBJECT
public:
	static SignalInstance	*GetInstance();
	static void Release();//释放
	static SignalInstance *signalinstance;
 signals:
	 void send_to_windwostwo();
	 void send_to_windwosone();
private:
	SignalInstance();
};

SignalInstance.cpp

```cpp
#include "SignalInstance.h"
SignalInstance* SignalInstance::signalinstance = nullptr;//初始化对象
//释放单例对象
void SignalInstance::Release()
{
	if (signalinstance != NULL)
	{
		delete signalinstance;
		signalinstance = NULL;
	}
}
SignalInstance::SignalInstance()
{
	
}
//获得单例对象
SignalInstance* SignalInstance::GetInstance()
{
	if (signalinstance == NULL)
	{
		signalinstance = new SignalInstance();
	}
	return signalinstance;
}

二、主界面添加组件

代码如下(示例):

#include <QObject>
#include<QVBoxLayout>
#include <QtWidgets/QWidget>
#include "SignalInstance.h"
#include"QtWidgets_1.h"
#include"QtWidgetsClass_2.h"
#include "instanse.h"
instanse::instanse(QMainWindow *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	QVBoxLayout *lay = new QVBoxLayout(this);
	QtWidgets_1 *widget1 = new QtWidgets_1();
	lay->addWidget(widget1);
	ui.widget->setLayout(lay);
	QVBoxLayout *lay2 = new QVBoxLayout(this);
	QtWidgetsClass_2 *widget2 = new QtWidgetsClass_2();
	lay2->addWidget(widget2);
	ui.widget_2->setLayout(lay2);
}

三、组件代码绑定信号和槽

1.组件1

#pragma once

#include <QWidget>
#include "ui_QtWidgets_1.h"

class QtWidgets_1 : public QWidget
{
	Q_OBJECT

public:
	QtWidgets_1(QWidget *parent = Q_NULLPTR);
	~QtWidgets_1();
private slots:
	void Show();
private:
	Ui::QtWidgets_1 ui;
};

#include "QtWidgets_1.h"
#include"SignalInstance.h"
#include <QObject>
#include <QtWidgets/QWidget>
#pragma execution_character_set("utf-8")
QtWidgets_1::QtWidgets_1(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	connect(ui.pushButton, SIGNAL(clicked()), SignalInstance::GetInstance(), SIGNAL(send_to_windwostwo()));//绑定信号
	connect(SignalInstance::GetInstance(), SIGNAL(send_to_windwosone()), this, SLOT(Show()));//绑定槽函数
}

QtWidgets_1::~QtWidgets_1()
{

}
void QtWidgets_1::Show()
{
	ui.textEdit->setText("我是窗口2激活的");
}

2.组件2

#pragma once

#include <QWidget>
#include "ui_QtWidgetsClass_2.h"

class QtWidgetsClass_2 : public QWidget
{
	Q_OBJECT

public:
	QtWidgetsClass_2(QWidget *parent = Q_NULLPTR);
	~QtWidgetsClass_2();
private slots:
	void Show();
private:
	Ui::QtWidgetsClass_2 ui;
};


#include "QtWidgetsClass_2.h"
#include"SignalInstance.h"
#include <QObject>
#include <QtWidgets/QWidget>
#pragma execution_character_set("utf-8")
QtWidgetsClass_2::QtWidgetsClass_2(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	connect(SignalInstance::GetInstance(), SIGNAL(send_to_windwostwo()),this,SLOT(Show()));//绑定槽函数
	connect(ui.pushButton, SIGNAL(clicked()), SignalInstance::GetInstance(), SIGNAL(send_to_windwosone()));//绑定信号
}

QtWidgetsClass_2::~QtWidgetsClass_2()
{
}
void QtWidgetsClass_2::Show()
{
	ui.textEdit->setText("我是窗口1激活的");
}

四、效果图

在这里插入图片描述
下载地址:https://download.csdn.net/download/qq_38491692/85309274

总结

本文案例使用组件较少,当项目较大时,比如上千个控件和布局,能有效的对信号和槽进行管理。如果对您有帮助,请点个赞。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt是一个功能强大的C++跨平台应用程序开发框架。Qt中提供了单例模式的实现方法,在Qt中实现一个单例需要使用Q_GLOBAL_STATIC宏来创建单例,并使用connect()连接信号。 全局信号是指可以被应用程序中的任何对象接收的信号。由于应用程序中的对象可以在应用程序的不同线程中运行,因此使用单例模式实现全局信号是一个很好的解决方案。 单例模式是一种创建单个实例的方式,确保只有一个实例被创建并在应用程序的整个生命周期中使用。Qt中使用Q_GLOBAL_STATIC宏定义单例,该宏的第一个参数是单例型。 例如,下面的代码定义了一个名为MySingleton的单例: ``` class MySingleton { public: static MySingleton* getInstance(); private: MySingleton(); Q_DISABLE_COPY(MySingleton) }; MySingleton *MySingleton::getInstance() { static const QScopedPointer<MySingleton> instance(new MySingleton()); return instance.data(); } typedef QGlobalStatic<MySingleton> MySingletonPtr; Q_GLOBAL_STATIC(MySingletonPtr, mySingleton) ``` 全局信号可以使用Qt中的QObject来实现。QObject中定义了signal和slot,可以在应用程序中的不同对象之间传递消息和数据。 为了实现全局信号,可以在单例中添加一个QObject对象,并在其中定义信号。在接收信号的对象中,可以使用connect()函数将对象的函数连接到全局信号。 例如,下面的代码向MySingleton中添加了一个QObject对象,并定义一个全局信号: ``` class MySingleton : public QObject { public: static MySingleton* getInstance(); signals: void mySignal(); private: MySingleton(); Q_DISABLE_COPY(MySingleton) }; MySingleton *MySingleton::getInstance() { static const QScopedPointer<MySingleton> instance(new MySingleton()); return instance.data(); } typedef QGlobalStatic<MySingleton> MySingletonPtr; Q_GLOBAL_STATIC(MySingletonPtr, mySingleton) MySingleton::MySingleton() : QObject() {} ``` 现在,就可以在应用程序中的其他对象中接收全局信号: ``` MySingleton::getInstance()->emit mySignal(); ``` 可以将mySignal()信号连接到任何具有匹配参数的函数中: ``` connect(MySingleton::getInstance(), &MySingleton::mySignal, this, &MyObject::mySlot); ``` 使用单例模式和QObjectQt可以非常方便地实现全局信号。通过这种方式,任何对象都可以接收应用程序中发生的事件,从而更加灵活和可扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值