Итак, у меня есть класс Qt MyQtClass
и унаследованный от QOject класс Sender
. Я хочу получить доступ к пользовательскому интерфейсу из класса Sender
(который, кстати, состоит только из статических членов), поэтому я настроил функции static Sender& instance()
, static void emitSignal()
и QSignal Q_SIGNAL void mySignal()
в классе Sender (см. Код ниже). В заголовке класса Qt MyQtClass.h
я настроил QSlot Q_SLOT void mySlot()
. Я соединяю эти два слота в main.cpp
(const bool connected = QObject::connect(&Sender::instance(), &Sender::mySignal, &w, &MyQtClass::mySlot);
)
Через qDebug();
Я обнаружил, что соединение установлено успешно, и как только я вызываю метод emitSignal()
, излучается сигнал. Слот, хотя никогда не вызывается.
Я догадываюсь, что моя ошибка в основном при соединении.
Код:
sender.h:
#pragma once
#include <QtWidgets/QMainWindow>
#include <qdebug.h>
class Sender : public QObject
{
Q_OBJECT
using QObject::QObject;
public:
/*----------------------------*/
/*---Lots of static Members---*/
/*----------------------------*/
static Sender& instance(){
static Sender m_instance;
return m_instance;
}
static void emitSignal() {
emit instance().mySignal();
}
Q_SIGNAL void mySignal() {
qDebug() << "Signal emitted!";
}
};
MyQtClass.h
#pragma once
#include <qdebug.h>
#include <QtWidgets/QMainWindow>
#include "ui_MyQtClass.h"
class MyQtClass : public QMainWindow
{
Q_OBJECT
public:
MyQtClass(QWidget *parent = Q_NULLPTR);
Q_SLOT void mySlot() {
qDebug() << "Slot invoked";
}
private:
Ui::MyQtClassClass ui;
};
MyQtClass.cpp
#include "MyQtClass.h"
#include "Sender.h";
#include <qdebug.h>
MyQtClass::MyQtClass(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
qDebug() << "Ui has been setup!";
}
main.cpp
#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::emitSignal();
return a.exec();
}
Большое спасибо за потраченное время!