Qt:信号不发送,或者时隙不被调用



我有两个Qt类隐含在这个问题:MainWindowotaManager
我想从otaManager发送一个信号,让MainWindow调用一个插槽。
MainWindow.h(https://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.cpp(https://github.com/Kobo-InkBox/inkbox/blob/1d48a6d85ee5b0a4db86c1d9f49510d0d923b297/otamanager.cpp#L15-L30):

...
if(global::otaUpdate::downloadOta != true) {
string_writeconfig("/opt/ibxd", "ota_update_checkn");
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函数,即使当我放置一些QDebug调用以查看它是否甚至启动时,也不输出也不做任何事情。

我对这一切感到很困惑,因为我在我的项目中对其他类也是这样做的,它工作得很好。

忘记接收对象:

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
信号现在发送没有任何问题。

最新更新