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 &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:如何将不同类的静态信号连接到插槽?的主要内容,如果未能解决你的问题,请参考以下文章

Qt for Qt:如何连接到具有新信号/插槽风格的信号?

如何在 Qt 中将插槽连接到信号 QProcess::started()?

如何将信号连接到插槽

QT:使用移动语义将信号连接到插槽

Qt - 使用 lambda 函数修改先前连接信号的插槽参数

Qt将信号连接到插槽