QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别)

使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的、种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用。关于窗口关闭的操作,在这里指出常用的三个槽,即quit(),exit()以及close()。
    首先说明窗口退出时,系统提示对话框的代码编辑。对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用。只是应注意二者调用的方式不同。如下程序示例:
        {
         QApplication* app;
         app->exit(0);
        }
         或者:
       {
         QApplication* app;
         app->quit();
       }
    此时二者是等价的,即void QApplication::quit ()等价于函数调用 QApplication::exit( 0 )。此时,若需要给出用户提示,则只需要在程序当中添加QMessageBox的消息判断语句,以提示用户是否确定退出应用程序。另外,quit()作为槽,也可以连接信号和槽的形式,响应某个信号后关闭应用程序。如:
          QPushButton *quitButton = new QPushButton( "Quit" );
          connect( quitButton, SIGNAL(clicked()), qApp, SLOT(quit()) );

如果关闭的不是应用程序,而是关闭窗口等部件的形式,则必须调用close()函数,已关闭部件。如下:
          if (!(QMessageBox::information(this,tr("CT Control View"),tr("Do you really want to log out CT Control View?"),tr("Yes"),tr("No"))))
         {
              this->close();
          }
    其中通过一条if语句,判断条件为一个对话框,根据用户的选择做出是否关闭该窗口部件,this在这里代表当前窗口部件对象的地址。当用户选择“Yes”时,该窗口部件退出;反之则取消退出操作。

至此,我们已经简单了解了应用程序和窗口等部件的退出或关闭的代码编辑。然而,如果用户点击窗口右上角的X按键时,你会发现窗口仍然会在不给出任何提示的情况下直接退出了,即便你在程序当中已添加了提示的对话框语句。那为什么此时的关闭操作没有按我们希望的那样先给出提示对话框呢?原因是此时的关闭操作并没有引起调用带有提示消息的关闭或退出语句。当用户点击X关闭窗口时,系统会自动将这个事件告之某个特定的函数,即void QWidget::closeEvent ( QCloseEvent * e ),因此,这种情况应特别注意。在关闭窗口前,可先定义一条消息语句,以提示用户是否确定关闭窗口。如:
  void mainWindow::closeEvent( QCloseEvent * event )//关闭窗口会先处理该事件函数
{
    switch( QMessageBox::information( this, tr("CT Control View"),
  tr("Do you really want to log out CT Control View?"),
  tr("Yes"), tr("No"),
  0, 1 ) )
 {
    case 0:
  event->accept();
        break;
    case 1:
 default:
        event->ignore();
        break;
 }
}
编译程序后,系统会在用户响应close操作时,自动调用该语句。也许这个时候你还会问,上面的那个功能函数究竟是把它定义成槽呢,还是定义成成员函数。答案是二者都可以。一方面槽本身就是一个特殊的成员函数,除了能与信号连接之外,其功能与函数无异。另一方面,此时不需要额外设置连接信号和槽,添加该功能函数之后,窗口一旦有了close操作,机会立即响应该。
尽管添加closeEvent( QCloseEvent * event )这一功能函数之后,窗口会在关闭时给出提示对话框。但有时候还会发生这样一种情况:在点击确认关闭后,还会再会出现一个对话框,即提示对话框会出现两次。那这又是什么原因呢?其实很简单,那是因为closeEvent( QCloseEvent * event )只会响应close的操作,出现两次对话框无疑是在自定义的关闭函数中又添加一条提示对话框语句,确认关闭后,响应close操作,这时系统又会马上调用closeEvent( QCloseEvent * event )这个函数。因此,解决的办法是只定义一个带提示对话框的关闭函数,对不同的关闭操作都相应closeEvent( QCloseEvent * event )这个函数即可。

最后,如果想要在关闭主窗口或主程序时,所有打开的独立的子窗口都能同时被关闭。那么这个时候一般是在main.cpp文件中连接信号void QApplication::lastWindowClosed ();关于lastWindowClosed()的详细介绍,这里不作说明,需要使用时可以使用Qt Assistant查看其使用发法。如:
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
ABMainWindow *mw = new ABMainWindow();
mw->setCaption( "Qt Example - Addressbook" );
a.setMainWidget( mw );
mw->show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
int result = a.exec();
delete mw;
return result;
}
这样,系统会在关闭主窗口部件时,同时关闭打开的其它子窗口程序。

比较值得说明的是,并不是使用了a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) )这条语句后就一定能实现该功能。在此之前,必须特别注意是否设定了主窗口部件,即调用setMainWidget这一功能函数,这样,当关闭这一主窗口部件时,才会响应关闭这一时刻已打开的其它子窗口部件。

默认情况下,QWidget::setAttribute(Qt::WA_QuitOnClose,true),所有窗口部件(QWidget及子类)该属性设置为true,除了短暂的窗口,如闪屏、工具窗口和弹出菜单该属性设置为false。但Qt的父子对象系统会以父对象(最顶层)为最后关闭时才退出应用程序(最后调用quit())。

QGuiApplication::setQuitOnLastWindowClosed(true);//默认情况下该属性设置为true。可以与上面的配套使用。

QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别)相关推荐

  1. close函数 qt_QT5笔记:关闭应用程序和窗口的函数

    23333 QT一坨,求一门面向傻瓜的语言. QT中 quit(),exit()以及close():常用的三个槽 对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都 ...

  2. java 关闭jpanel_如何在Java中关闭Jpanel程序

    我正在制作一个Java游戏,我需要一些关于如何操作的建议.如何在Java中关闭Jpanel程序 目前我使用2个不同的.java文件来制作游戏.我有一个扩展JFrame的主程序,我调用扩展JPanel的 ...

  3. 详解在QT中写控制台程序 实例

    详解在QT中写控制台程序 实例 在QT中写控制台程序 实例是本文介绍的内容,不多说了,先来看本文内容. AD: 本文介绍的是详解在QT中写控制台程序 实例,来看那内容.找到两种方法可以写控制台程序 第 ...

  4. linux中进程退出函数:exit()和_exit()的区别

    linux中进程退出函数:exit()和_exit()的区别 (1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核. (2)调用_exit函数时,其会关闭 ...

  5. linux qt应用程序全屏,QT中MDI应用程序中更改子窗口大小或是全屏显示子窗口的方法...

    1.QT中窗口部件QWidget成员函数showFullScreen();是用于将窗口部件全屏显示. 但是他只对窗口模式的部件有用.子窗口的特征是 Qt::SubWindow,不是独立的窗口.因此对其 ...

  6. QT中串口通信程序(转)

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...

  7. MFC中修改应用程序主窗口的标题

    1.第一种方法: 找到字符串资源中的IDR_MAINFRAME, 将"MyTextOut\n\nMyText\n\n\nMyTextOut.Document\nMyTextDocument& ...

  8. Qt中使用QAxObject的dynamicCall和querySubObject函数操作SolidWorks的方法

    大部分函数可以直接从VB语言"翻译"过去成为Qt中的C++语言,如 Set Part = swApp.OpenDoc6(strFilePath & "\" ...

  9. 在QT中使用socket编程:解决connect函数名称冲突

    问题 当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的socket网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连 ...

最新文章

  1. 快给你的app上锁吧(android图案解锁)
  2. SAP 创业计划 ---之三
  3. selenium 文件上传
  4. TCP socket和web socket的区别
  5. bzoj 3626: [LNOI2014]LCA(离线差分+树链剖分)
  6. html 车牌号输入代码,html中车牌号省份简称输入键盘的示例代码
  7. linux下的经典软件总结
  8. c语言设计评分程序,C语言程序设计课程设计---设计比赛评分系统
  9. 【转】物业管理与移动互联网科技|微信公众平台,物业app,物业O2O
  10. SAP 针对国家 country, 维护税码 tax code
  11. 启强书屋(书荒地老)
  12. 渗透测试工具--Nessue漏洞扫描与分析软件
  13. linux怎么在终端里查系统信息,Neofetch:在终端中显示Linux系统信息
  14. 大数据项目-01--PU、VU、每个网站的每个地区访问量?
  15. 普元 AppServer 6.5 哑安装后执行启动命令./startup.sh后启动失败
  16. 程序员怎么应对行业变化?
  17. 对游戏系统迭代的个人看法
  18. PostgreSQL 11 1000亿 tpcb、1000W tpcc 性能测试 - on 阿里云ECS + ESSD (含quorum based 0丢失多副本配置与性能测试)...
  19. 计算机基础知识之了解计算机,计算机基础知识(计算机基础知识你了解吗?)...
  20. 厚涂学习方法有哪些,怎么操作

热门文章

  1. preg_match 函数使用及正则表达式各种示例
  2. 国家集训队1999-2009论文集
  3. java是编译型语言还是解释型语言?
  4. svn 更新命令(冲突时使用theirs)
  5. darknet图像预处理函数random_augment_image研究
  6. Android状态栏微技巧,带你真正理解沉浸式模式
  7. 【论文阅读】【三维目标检测】在Range view上做3D目标检测
  8. android 系统语言切换,Android系统切换语言更新应用界面方法
  9. Linux中history的巧用
  10. 斯蒂芬.杜思齐教授担任剑桥大学校长的就职演说