Qt5:虽然已连接,但信号已发出但未调用插槽

Qt5: Though connected, Signal emmited but Slot not being called

所以我有一个QtclassMyQtClass,一个QOject继承classSender。我想从 Senderclass 访问 Ui (顺便说一句,它只包含静态成员),所以我设置了 static Sender& instance()static void emitSignal() 函数和 Sender class 中的 QSignal Q_SIGNAL void mySignal()(请参见下面的代码)。在 Qt-class-header MyQtClass.h 中,我设置了 QSlot Q_SLOT void mySlot()。我在 main.cpp
中连接了这两个插槽 (const bool connected = QObject::connect(&Sender::instance(), &Sender::mySignal, &w, &MyQtClass::mySlot);)

通过qDebug();我发现连接成功了,一旦我调用了方法emitSignal(),信号就被发射了。 Slot 虽然永远不会被调用。

我想我的错误主要在连接处。

代码:

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();
}

非常感谢您的宝贵时间!

我会检查您的构建系统。你不应该在没有重新定义错误的情况下用函数体编译 Q_SIGNAL 。如果您可以构建它,您可能不会涉及任何您想要使用的 Qt 机制。我对您的视觉 Studio/mingw 环境没有任何经验,但我能够在 Linux 平台上构建以下内容。

main.cpp

#include <QDebug>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow> 
#include "Sender.h"                                                          
#include "MyQtClass.h"                                                       
//#include "ui_MyQtClass.h"                                                  

MyQtClass::MyQtClass(QWidget *parent)                                        
    : QMainWindow(parent)                                                    
{                                                                            
    qDebug() << "Ui has been setup!";                                        

}                                                                            

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();
} 

Sender.h

#pragma once
#include <QtWidgets/QMainWindow>
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();
}; 

MyQtClass.h

#pragma once
#include <QtWidgets/QMainWindow>
#include <QDebug>

class MyQtClass : public QMainWindow
{   
    Q_OBJECT                                                                 

public:
    MyQtClass(QWidget *parent = Q_NULLPTR);                                  

    Q_SLOT void mySlot() {
        qDebug() << "Slot invoked";                                          
    }   

private:
    //Ui::MyQtClassClass ui;
};

然后我手动构建它并调用 Meta-Object Compiler

moc Sender.h > moc_Sender.cpp
moc MyQtClass.h > moc_MyQtClass.cpp
g++  main.cpp moc_Sender.cpp moc_MyQtClass.cpp -I /usr/include/x86_64-linux-gnu/qt5/QtCore/ -I /usr/include/x86_64-linux-gnu/qt5 -fPIC -std=c++11 -I /usr/include/x86_64-linux-gnu/qt5/QtWidgets/ -lQt5Core -lQt5Widgets

产生了预期的输出

user@mintvm ~ $ ./a.out 
Ui has been setup!
Connection established:  true
Slot invoked

您是否尝试过使用 qmake 构建系统,这样您就不必担心与元对象系统编译相关的所有细节?