使用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这一功能函数,这样,当关闭这一主窗口部件时,才会响应关闭这一时刻已打开的其它子窗口部件。
 

Qt的quit(),exit()以及close()事件捕获的更多相关文章

  1. 第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析

    老猿Python博文目录 老猿Python博客地址 按照老猿规划的章节安排,信号和槽之后应该介绍事件,但事件在前面的随笔<PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法 ...

  2. PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法大全及对比分析

    一. 概述 PyQt的图形界面应用中,事件处理类似于Windows系统的消息处理.一个带图形界面的应用程序启动后,事件处理就是应用的主循环,事件处理负责接收事件.分发事件.接收应用处理事件的返回结果, ...

  3. javascript中的事件冒泡和事件捕获

    1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...

  4. touches 事件捕获不到

    在UIView上加载了一个UIScrollView(全屏),touches 事件捕获不到了 原因:UIView的touch事件被UIScrollView捕获了,无法传递下去 解决方法:写一个UIScr ...

  5. 事件流之事件冒泡与事件捕获<JavaScript高级程序设计>学习笔记

    1.事件流 浏览器开发团队遇到一个很有意思问题:页面的那一部分会拥有特定的事件? 对于理解这个问题您可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其实不是一个圆,而是纸上 ...

  6. javascript中的事件冒泡、事件捕获和事件执行顺序

    谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...

  7. js之事件冒泡和事件捕获

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  8. js之事件冒泡和事件捕获详细介绍

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  9. 浅谈javascript中事件冒泡与事件捕获

    事件冒泡:一个事件会顺着他的层级一直往上传,一直传到document上为止,即从盒模型上看是从内到外的过程. 例: <!DOCTYPE html><html lang="e ...

随机推荐

  1. PHP可变长函数方法介绍

    1.三个重要函数 func_num_args()  返回实参个数 func_get_arg(i)    返回某个实参的值       func_get_args()        以数组的形式返回实参 ...

  2. memached 服务器lru算法

    1.LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条 ...

  3. UVa 10561 - Treblecross

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. redis Ok2

    Redis::__construct 描述: 创建一个Redis客户端 范例: $redis = new Redis();   connect, open 描述: 实例连接到一个Redis. 参数:h ...

  5. Linux-编译器gcc/g++编译步骤

    gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...

  6. 戴文的Linux内核专题:07内核配置(3)

    转自Linux中国 OK,我们还继续配置内核.还有更多功能等待着去配置. 下一个问题(Enable ELF core dumps (ELF_CORE))询问的是内核是否可以生成内核转储文件.这会使内核 ...

  7. android webview实战

    webSettings = wvShowProduce.getSettings();//设置WebView属性,能够执行Javascript脚本webSettings.setJavaScriptEna ...

  8. 【转发】linux yum命令详解

    linux yum命令详解 yum(全 称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理, ...

  9. 自定义ImageView

    package com.example.myimageview; import android.content.Context;import android.graphics.Bitmap;impor ...

  10. shell指令expr和test指令

    通过expr指令可以进行+.-.*.\.%等运算,但是有一点值得注意,使用乘法时,要在*前加上一个\符号. 通过test指令可以进行逻辑测试,进行测试的情况有四种: 1.整数测试 a.判断两个整数是否 ...