我在Qt编码。我与赛普拉斯FX2LP进行USB通信。当设备未通过USB电缆连接时,我应该显示一个带有OK-Abort选项的对话框。当用户点击确定时,我重新检查USB连接。它运作良好。但是当用户点击中止时,我应该完全关闭程序。中止选项不起作用并重新显示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(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();
}
答案 0 :(得分:0)
Send_command_packet()
可能会被多次调用,因此它会排出很多已排队的show_message()
。
他们中的第一个将调用排队到close()
,但还有其他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();
}
}
}