-->

QT5:虽然连接,信号emmited但插槽不会被调用(Qt5: Though connected,

2019-10-29 13:01发布

所以我有一个Qt类MyQtClass和QOject继承类Sender 。 我想从访问UI Sender类(其中的方式仅由静态成员),所以我成立了static Sender& instance() static void emitSignal()函数和QSignal Q_SIGNAL void mySignal()在发件人类(见下面的代码)。 在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();
}

非常感谢您的宝贵时间!

Answer 1:

我会检查你的编译系统。 你不应该能够与函数体编译Q_SIGNAL没有得到重新定义错误。 如果你能建立它,你很可能不涉及任何你想使用Qt的机械。 我没有与你的Visual 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;
};

然后我建立它手动调用元对象编译器

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的构建系统,让您不必担心所有的相关的元对象系统的编制细节?



文章来源: Qt5: Though connected, Signal emmited but Slot not being called