Qt: Как подключить статический сигнал от другого класса к слоту? - PullRequest
0 голосов
/ 12 января 2019

Итак, давайте предположим, что у меня есть обычный класс Qt MyQtClass и класс MyClass с ТОЛЬКО статическими членами. Если я хочу получить доступ к интерфейсу MyQtClass, я должен использовать сигналы и слоты. Поэтому я создаю статический сигнал (статический, чтобы я мог просто вызвать его как MyClass::mySignal();) и слот в классе Qt. Как я могу соединить статический сигнал от MyClass со слотом из класса Qt, не имея объекта MyClass, так как он имеет только статические члены? Я знаю, что классы, содержащие только статические члены, не считаются хорошим дизайном в 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 голосов
/ 12 января 2019

Как указано в этой теме , невозможно испускать статические сигналы, поскольку она всегда связана с 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"
...