繁体   English   中英

Qt:要么信号不发送,要么槽没有被调用

[英]Qt: either signal won't send, or slot is not called

我在这个问题中隐含了两个 Qt 类: MainWindowotaManager
我想从otaManager发送一个信号,并让MainWindow在它发送时调用一个插槽。
这是MainWindow.hhttps://github.com/Kobo-InkBox/inkbox/blob/1d48a6d85ee5b0a4db86c1d9f49510d0d923b297/mainwindow.h#L104 ):

private slots:
    void openUpdateDialogOTA(bool open);
    ...

private:
    ...
    otaManager *otaManagerWindow;

MainWindow.cpp ( https://github.com/Kobo-InkBox/inkbox/blob/1d48a6d85ee5b0a4db86c1d9f49510d0d923b297/mainwindow.cpp#L979-L993 ):

...
void MainWindow::openUpdateDialogOTA(bool open) {
    if(open == true) {
        global::otaUpdate::isUpdateOta = true;
        openUpdateDialog();
    }
    else {
        ;
    }
}


void MainWindow::launchOtaUpdater() {
    otaManagerWindow = new otaManager(this);
    connect(otaManagerWindow, SIGNAL(canOtaUpdate(bool)), SLOT(openUpdateDialogOTA(bool)));
    otaManagerWindow->setAttribute(Qt::WA_DeleteOnClose);
}

otaManager.h ( https://github.com/Kobo-InkBox/inkbox/blob/1d48a6d85ee5b0a4db86c1d9f49510d0d923b297/otamanager.h#L21-L22 ):

...
signals:
    void canOtaUpdate(bool yesno);
...

otaManager.cpphttps://github.com/Kobo-InkBox/inkbox/blob/1d48a6d85ee5b0a4db86c1d9f49510d0d923b297/otamanager.cpp#L15-L30 ):

        ...
        if(global::otaUpdate::downloadOta != true) {
            string_writeconfig("/opt/ibxd", "ota_update_check\n");
            while(true) {
                if(QFile::exists("/run/can_ota_update") == true) {
                    if(checkconfig("/run/can_ota_update") == true) {
                        emit canOtaUpdate(true);
                        qDebug() << "OTA update is available!";
                        break;
                    }
                    else {
                        emit canOtaUpdate(false);
                        qDebug() << "No OTA update available.";
                        break;
                    }
                }
            }
       ...

编译运行时,程序通过了 otaManager 中的所有条件并输出“OTA update is available”。 通过 QDebug 调用的消息。
虽然,要么在接收信号时 MainWindow 没有调用该插槽,要么它没有被发送,因为 MainWindow 中的openUpdateDialogOTA function,即使我进行了一些 QDebug 调用以查看它是否已启动,也没有 output 也没有做任何事情.

我对这一切感到很困惑,因为我对我项目中的其他类也是这样做的,而且效果很好。

你忘了接收器 object:

connect(otaManagerWindow, SIGNAL(canOtaUpdate(bool)), SLOT(openUpdateDialogOTA(bool)));

尝试对连接方法使用新样式:

connect(a, &A::OnSignal, b, &B::OnSlot);

while(true)循环似乎是罪魁祸首。 我仍然不知道为什么,我想知道这是否正常。 我改为使用 QTimer 实现,如您在此处所见: https://github.com/Kobo-InkBox/inkbox/blob/1f539e6bf3020d2a4069295133e0cd470efb8ca9/otamanager.cpp
现在可以毫无问题地发送信号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM