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 &lt;qdebug.h&gt; #include &lt;QtWidgets/QApplication&gt; int main(int argc, char *argv[]) QApplication a(argc, argv); MyQtClass w; w.show(); const bool connected = QObject::connect(&amp;Sender::instance(), &amp;Sender::mySignal, &amp;w, &amp;MyQtClass::mySlot); qDebug() &lt;&lt; "Connection established?" &lt;&lt; connected; Sender::myFunction1(); return a.exec(); 通过 qDebug 我发现,该插槽从未被调用。 @itssimsch 首先,您是否在未经修改的情况下测试了我的代码?另一方面,我认为你在另一部分犯了错误,所以我需要检查你的代码,所以通过 github 分享它会很棒 好吧,我不使用 Github,你还必须安装 Visual Studio Qt-Addon。这是整个代码:pastebin.com/JFCay8cH 感谢您的帮助 @itssimsch 正如我所见,您对我的解决方案的实施存在一些不便,例如实施信号(必须由 MOC 完成)等。 ***.com/questions/54173098/…所以我认为我的解决方案是有效的,你能把它标记为正确吗? 刚刚这样做,您的解决方案非常好,错误是我不能为信号定义函数体。非常感谢您的宝贵时间!

以上是关于Qt不同类之间如何emit信号进行触发操作?的主要内容,如果未能解决你的问题,请参考以下文章

Qt emit同时发送信号给多个槽函数?

qt中c语言函数发送qt信号

QObject三大核心功能——信号与槽

QT程序socket的readyRead信号不触发

Qt信号槽原理(调用)

QT将不同类的信号和插槽连接到主窗口类?