c++ QT Creator中发出信号后未调用插槽

gcuhipw9  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(191)

为什么ClassA中的slot sl_classASaveDataFromClassB没有被调用?我从另一个类(ClassB)向slot发出一个信号,并期望在调用ClassB::closeEvent函数时调用sl_classASaveDataFromClassB函数。
事件流程如下:
1.程序启动时,调用ClassA构造函数,建立信号/插槽连接:connect(ClassB::getInstance(), SIGNAL(&ClassB::sig_ClassBData(float,float)), this, SLOT(sl_classASaveDataFromClassB(float,float)));,其中我将B类的信号连接到A类的SLOT函数。
1.用户看到一个通用配置屏幕。2这个屏幕的代码包含一个带有配置变量的结构。
1.用户点击一个按钮,启动一个窗口,在该窗口中输入与两个浮点值(blahAblahB)相关的两个浮点值。
1.用户选择调用ClassB::on_btnDataSave_clicked()的“保存”图标
1.这将调用发出信号sig_classBData的QT函数ClassB::closeEvent(QCloseEvent *event)
在代码中放置断点表明在窗口关闭时调用了overidden ClassB::closeEvent,并发出了信号,但从未调用slot函数。
ClassA.c

ClassA_UI::ClassA_UI(QWidget *parent, c_Instrument *Instrument) :
    QFrame(parent),
    ui(new Ui::ClassA_UI)
{
        connect(ClassB::getInstance(), SIGNAL(&ClassB::sig_ClassBData(float,float)), this, SLOT(&sl_classASaveDataFromClassB(float,float)));
}

void ClassA_UI::on_btnClick_setVals()
{
    ClassB::getInstance()->show();
}

void ClassA_UI sl_classASaveDataFromClassB(float latitude, float longitude)
{
    qDebug() << "test";
}

ClassA.h

class ClassA_UI : public QFrame
{
    Q_OBJECT

public:
    explicit ClassA_UI(QWidget *parent = 0);
    ~ClassA_UI();
public slots:
     sl_classASaveDataFromClassB(float blahA, float blahB)
}


ClassB* ClassB::getInstance()
{
    if(instance == nullptr){
        instance = new ClassB();
    }
    return instance;
}

ClassB.c

ClassB* ClassB::instance = nullptr;

ClassB::ClassB(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClassB)
{
    ui->setupUi(this);

    data = new data;

    connect(this, SIGNAL(sig_ClassBUpdateBox(QString, QString)), this, SLOT(sl_GeoLocationUpdateBox(QString,QString)),Qt::QueuedConnection);
}

void ClassB::on_btnDataSave_clicked()
{
    // save long lat values here

    location->blahA = ui->lineEdit_blahA->text().toFloat();
    location->blahB = ui->lineEdit_blahB->text().toFloat();

    // Values set successfully
    emit sig_ClassBUpdateBox( "Location Updated", "Location update applied.");
    this->close();

}

void ClassB::closeEvent(QCloseEvent *event)
{
    qDebug() << "closeEvent" ;
    emit sig_classBData(data->blahA, data->blahB);

    event->accept();
}

ClassB.h

namespace Ui {
class ClassB;
}

class ClassB : public QWidget
{
    Q_OBJECT

public:
    explicit ClassB(QWidget *parent = nullptr);
    ~ClassB();

private:
    Ui::ClassB *ui;
private:
    typedef struct  {
        float blahA;
        float blahB;
    } data;

    data *location;

    static ClassB* instance;
public:
    static ClassB* getInstance();
signals:
    void sig_ClassBUpdateBox(QString Title, QString Message);
    void sig_classBData(float blahA, float blahB);

};
zxlwwiss

zxlwwiss1#

我通过将连接字符串修改为以下内容解决了这个问题:

connect(ClassA::getInstance(), SIGNAL(sig_ClassBData(float,float)), this, SLOT(sl_classASaveDataFromClassB(float,float)), Qt::QueuedConnection);

我会把我的发现分享给任何遇到类似问题的人。
所以connect函数实际上为连接返回了一个布尔值true/false,在构造函数中我添加了一个临时布尔变量,我在这个变量上放置了一个断点,它显示连接返回了false,这告诉我classA中的槽没有被调用的原因是因为连接从未成功建立。
在文档中,连接字符串如下所示:

QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

分解一下:

// Send class
const QObject *sender = w_sfmGeoLocConfiguration::getInstance(), 
const char *signal = SIGNAL(sig_GeoLocationData(float,float)), 

// Recieve class
const QObject *receiver = this,
const char *method = SLOT(sl_updateGeoLocation(float,float)), 
Qt::ConnectionType type = Qt::QueuedConnection

相关问题