簡體   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