Qt:如何将不同类别的静态信号连接到插槽?

时间:2019-01-11 22:05:03

标签: c++ qt qt5

因此,让我们假设我有一个普通的Qt类MyQtClass和一个MyClass类,只包含静态成员。如果要访问MyQtClass的用户界面,则必须使用信号和插槽。因此,我创建了一个静态Signal(静态,所以我可以像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 个答案:

答案 0 :(得分:0)

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"