Qt不同类之间如何emit信号进行触发操作?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt不同类之间如何emit信号进行触发操作?相关的知识,希望对你有一定的参考价值。
假设现在我定义了一个类A,现在想在A的一个函数void A::function1()当中的结尾处emit一个信号signal1(),然后利用这个信号触发另一个类B进行某项操作void B::function2(),请问connect应该如何书写呢(尤其是sender和SIGNAL参数)?另外,对于类A和类B,有什么特殊要求吗?
要在类A,和类B都可见的地方.比如在一个QMainwindow中.
定义一个类A *a,和一个类B *b,(当然要分配空间).你就可以这么connect他们.
connect(a,SIGNAL(signal1()),b,SLOT(function2()));
对于A,B两个类出来都必须继承于QObject类没其他要求.. 参考技术A 必须有一个C类中定义一个A类对象a和一个B类对象b,然后
connect(&a, SIGNAL(signal()), &b, SLOT(function2()));
AB类必须继承QObject类追问
请问signal1在C类中引用的时候不需要写成a.signal1(),而function2()不需要写成b.function2()么?尽管A、B类已经在C中实例化,似乎connect当中都不“认识”这两个函数
Qt:如何将不同类的静态信号连接到插槽?
【中文标题】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不同类之间如何emit信号进行触发操作?的主要内容,如果未能解决你的问题,请参考以下文章