我有两个Qt类隐含在这个问题:MainWindow
和otaManager
。
我想从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
信号现在发送没有任何问题。