Вопрос:
Я кодирую в Qt. У меня есть USB-связь с Cypress FX2LP. Когда устройство не подключено через USB-кабель, я должен показать диалоговое окно с опцией OK-Abort. когда пользователь нажмет “ОК”, “Повторно проверьте соединение USB”. Он работает хорошо. но когда пользователь нажимает на прерывание, я должен полностью закрыть программу. Опция abort не работает и повторно отображает диалог OK-Abort. В чем проблема с моим кодом? Это часть моего кода (Main.cpp/Mainwindow/My_Receive_Data_Thread (поток связи USB)):
main.cpp:
#include «mainwindow.h» #include <QApplication> #include <QTimer> #include <QIcon> int main(int argc, char *argv[]){ QApplication a(argc, argv); a.setQuitOnLastWindowClosed(true); a.processEvents(); MainWindow w; w.setAttribute(Qt::WA_QuitOnClose); w.show(); return a.exec(); }
My_Receive_Data_Thread:
My_Receive_Data_Thread::~My_drawing_object(){ } void My_Receive_Data_Thread::Send_command_packet(){ CCyUSBDevice USBDevice;// CCyUSBDevice recognize only Cypress Devices short int numDevices = USBDevice.DeviceCount(); if(numDevices==0) emit show_message(«warning»,»USB Device not connected!»); }
MainWindow:
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow){ ui->setupUi(this); My_Receive_Data_Thread_1= new My_Receive_Data_Thread(this); connect(My_Receive_Data_Thread_1,SIGNAL(show_message(QString,QString)),this,SLOT(show_message_box(QString,QString)),static_cast<Qt::ConnectionType>(Qt::UniqueConnection)); connect(this,SIGNAL(Send_command_packet()),My_Receive_Data_Thread_1,SLOT(Send_command_packet()),static_cast<Qt::ConnectionType>(Qt::UniqueConnection)); } MainWindow::~MainWindow(){ delete ui; } void MainWindow::show_message_box(QString title,QString text){ QMessageBox::StandardButton reply; reply=QMessageBox::question(this,title,text,QMessageBox::Abort|QMessageBox::Ok); if(reply==QMessageBox::Abort) close(); } Лучший ответ:
Send_command_packet(), вероятно, вызывается несколько раз, поэтому он испускает много объектов show_message() которые находятся в очереди.
Первый из них ставит в очередь вызов функции close(), но для обработки все еще show_message() другое show_message().
Добавьте bool m_closed в MainWindow, установите значение true при закрытии и проверьте его в show_show_message_box().
void MainWindow::show_message_box(QString title,QString text){ if (!m_closing){ QMessageBox::StandardButton reply; reply=QMessageBox::question(this,title,text,QMessageBox::Abort|QMessageBox::Ok); if(reply==QMessageBox::Abort){ m_closing = true; close(); } } }