如果在窗体关闭前自行判断是否可关闭,重新实现这个窗体的closeEvent()函数
void MainWindow::closeEvent(QCloseEvent *event)
{
if (maybeSave())
{
event->accept();
}
else
{
event->ignore();
}
}
注意:如果加入QMessageBox提示框后,有时没有这么简单。
例如窗体隐藏只显示托盘图标的时候,不能直接这么写,因为QMessageBox提示框是最后一个窗口,关闭后也会关闭程序。
void Alarm::closeEvent(QCloseEvent *event)
{
int r=QMessageBox::information(0,"Quit",tr("确定退出?"),QMessageBox::Yes | QMessageBox::No );
if(r==QMessageBox::Yes)
{
trayIcon->hide();
}
else if(r==QMessageBox::No)
{
event->ignore();//执行后依然会关闭程序。
}
}
修改如下:
connect(this, SIGNAL(mySignal(), this, SLOT(hide()), Qt::QueuedConnection);
void Alarm::changeEvent(QEvent *event)
{
if (event->type() == QEvent::WindowStateChange)
{
if (isMinimized())
{
emit mySignal();
event->ignore();
}
}
DirectConnection表示在connect函数执行的线程里执行slot, QueuedConnection表示slot执行在接受者所在的线程
Qt::DirectConnection
When emitted, the signal is immediately delivered to the slot.
假设当前有4个slot连接到QPushButton::clicked(bool),当按钮被按下时,QT就把这4个slot按连接的时间顺序调用一遍。显然这种方式不能跨线程(传递消息)。
Qt::QueuedConnection
When emitted, the signal is queued until the event loop is able to deliver it to the slot.
假设当前有4个slot连接到QPushButton::clicked(bool),当按钮被按下时,QT就把这个signal包装成一个 QEvent,放到消息队列里。QApplication::exec()或者线程的QThread::exec()会从消息队列里取消息,然后调用 signal关联的几个slot。这种方式既可以在线程内传递消息,也可以跨线程传递消息。