Qt:如何将不同类的静态信号连接到插槽?
Posted
技术标签:
【中文标题】Qt:如何将不同类的静态信号连接到插槽?【英文标题】:Qt: How to connect static signal from different class to slot? 【发布时间】:2019-01-11 22:05:02 【问题描述】:假设我有一个普通的 Qt 类 MyQtClass
和一个只有静态成员的类 MyClass
。如果我想访问MyQtClass
的用户界面,我必须使用信号和插槽。所以我创建了一个静态信号(静态的,所以我可以像 MyClass::mySignal();
一样调用它)和 Qt 类中的一个插槽。如何在没有MyClass
的对象的情况下将来自 MyClass 的静态信号与来自 Qt 类的插槽连接起来,因为它只有静态成员?
我知道只有静态成员的类在 c++ 中不被认为是一个好的设计,但我现在对项目的了解太远了,我想知道是否有办法只使用静态成员。
提前致谢!
代码:
MyQtClass.h:
#include "ui_MyQtClass.h"
class MyQtClass : public QMainWindow
Q_OBJECT
public:
MyQtClass(QWidget *parent = Q_NULLPTR);
Q_SLOT void mySlot();
private:
Ui::MyQtClassClass ui;
;
MyClass.h:
#pragma once
#include <QtWidgets/QMainWindow>
class MyClass : public QObject
public:
static void myFunction1();
static void myFunction2();
/*--- More Stuff ---*/
Q_SIGNAL static void mySignal();
;
【问题讨论】:
【参考方案1】:如this thread 中所述,不可能发出静态信号,因为它始终与QObject
相关联,作为替代方案,它们会创建一个与您想要的等效的单例。
#include <QtCore>
class Receiver: public QObject
Q_OBJECT
public:
using QObject::QObject;
Q_SLOT void mySlot()
qDebug()<< __PRETTY_FUNCTION__;
QCoreApplication::quit();
;
class Sender: public QObject
Q_OBJECT
using QObject::QObject;
public:
static Sender& instance()
static Sender m_instance;
return m_instance;
static void myFunction1()
emit instance().mySignal();
Q_SIGNAL void mySignal();
;
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
Receiver r;
QObject::connect(&Sender::instance(), &Sender::mySignal, &r, &Receiver::mySlot);
QTimer::singleShot(1000, &Sender::myFunction1);
return a.exec();
#include "main.moc"
【讨论】:
我尝试使用你的方法,一切正常,除了插槽。我的代码与您的基本相同,但我的主要代码不同:#include "MyQtClass.h" #include "Sender.h" #include <qdebug.h> #include <QtWidgets/QApplication> int main(int argc, char *argv[]) QApplication a(argc, argv); MyQtClass w; w.show(); const bool connected = QObject::connect(&Sender::instance(), &Sender::mySignal, &w, &MyQtClass::mySlot); qDebug() << "Connection established?" << connected; Sender::myFunction1(); return a.exec();
通过 qDebug 我发现,该插槽从未被调用。
@itssimsch 首先,您是否在未经修改的情况下测试了我的代码?另一方面,我认为你在另一部分犯了错误,所以我需要检查你的代码,所以通过 github 分享它会很棒
好吧,我不使用 Github,你还必须安装 Visual Studio Qt-Addon。这是整个代码:pastebin.com/JFCay8cH 感谢您的帮助
@itssimsch 正如我所见,您对我的解决方案的实施存在一些不便,例如实施信号(必须由 MOC 完成)等。 ***.com/questions/54173098/…所以我认为我的解决方案是有效的,你能把它标记为正确吗?
刚刚这样做,您的解决方案非常好,错误是我不能为信号定义函数体。非常感谢您的宝贵时间!以上是关于Qt:如何将不同类的静态信号连接到插槽?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Qt 中将插槽连接到信号 QProcess::started()?