QCloseEvent

 如果在窗体关闭前自行判断是否可关闭,重新实现这个窗体的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。这种方式既可以在线程内传递消息,也可以跨线程传递消息。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值