[英]Qt: either signal won't send, or slot is not called
我在这个问题中隐含了两个 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_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.