http://sunshine1106.blog.51cto.com/1371108/305106/ 
近日在测试软件功能时,发现一些不是太显眼问题,如希望在点击窗口右上角的X按钮关闭窗口时,能够提示用户是否确认关闭;使用完软件并关闭主程序时,打开的子窗口在主窗口关闭后能够同时关闭等一些问题。当然,这些问题并不影响软件的功能应用,但作为一个面向广大用户的实用软件的话,这显然不太符合用户的使用习惯。并且,加入对话框的操作能避免一些不小心的错误操作给用户带来的麻烦。对此,我本人针对该问题做了一些修改工作,以使窗口关闭时,跳出对话框提示用户是否确认关闭,以及在主窗口关闭时,响应已打开的子窗口同时全部关闭。以下是本人对此做出的一些总结。
使用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编辑关闭窗口程序的一些见解相关推荐

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

    QT中关闭应用程序和窗口的函数(quit(),exit()以及close()的区别) 使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程 ...

  2. Qt实现关闭窗口触发事件

    Qt程序关闭前,有时候需要弹出一个确认窗口,如何实现呢? 当鼠标点击窗口右上角的关闭按钮时,会触发一个窗口关闭事件(QCloseEvent),只需要覆写窗口类的closeEvent(QCloseEve ...

  3. qt中关闭窗口资源释放问题

    针对QDialog对象,如果是栈上分配的,就不存在资源泄漏问题,但是当对象是new出来的,并且以局部对像存在,当关闭时,窗口只是隐藏,资源是没有释放的,每次exec后者需要delete来释放,另外一种 ...

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

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

  5. QT QPushButton点击事件的实现及关闭窗口命令

    最近需要对按钮实现效果:当鼠标按下时按钮有效果1,然后鼠标松开时按钮有效果2. 分析:这里没有现成的信号可以使用,需要重载mousePressEvent 及 mouseReleaseEvent 事件函 ...

  6. 【Qt】Qt窗口程序

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序设计 04. 程序执行 05. 预留 06. 附录 01. 概述 程序要实现的功能是:运行开始出现一个对话框,按下登录 ...

  7. 拦截QT关闭窗口的CloseEvent

    写程序遇到了QTimer启动以后可以在普通函数(例如槽函数)里面停止,但是无法在析构函数里停止的问题.想方设法皆无果,最后之得从关闭窗口上下功夫,关闭窗口时判断如果timer还是启动状态(即后台进程还 ...

  8. qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...

    前言勇哥对于C语言,C++早些年有一些接触,这个系列贴子就记载一下C++应用框架的学习经验. 在写程序时,UI.基础类库.应用程序框架对于vc来讲,只能依靠MFC和QT了. 勇哥对MFC有很强的抵触, ...

  9. 【Qt开发】QT对话框去掉帮助和关闭按钮 拦截QT关闭窗口的CloseEvent

    建了一个对话框,我不想把边框去掉,只想去掉关闭按钮, setWindowFlags(windowFlags()&~Qt::WindowCloseButtonHint&~Qt::Wind ...

最新文章

  1. OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort
  2. linux执行cli文件,linux – 如何“撤消”在终端/ CLI中执行的“解压缩”?
  3. springcloud 相同服务名_Spring 微服务从入门到入土
  4. 从零入门 Serverless | SAE 场景下,应用流量的负载均衡及路由策略配置实践
  5. LeetCode之Count and Say
  6. String与StringBuffer、StringBuilder之间的转换
  7. VMware vRealize Operations Manager SSRF漏洞(CVE-2021-21975、SSRF)
  8. eBPF 入门之编程
  9. iOS 12.4 越狱已经发布
  10. 软件工程学习进度第六周暨暑期学习进度之第六周汇总
  11. mysql 字段值不同枚举_【mysql】关于枚举值 '1','0'的神奇判断
  12. Java中Xml文件的解析
  13. java运行库下载_Java运行库下载-jdk1.7 64位下载1.8.0.20 官方最新版-东坡下载
  14. 基于实时流的数据基础-分享
  15. 计算机遥感毕设选题,遥感硕士毕业论文题目
  16. 文献笔记:Plasmonic metagratings for simultaneous determination of Stokes parameters
  17. Azure云centos7安装图形化界面
  18. 零基础边缘端智慧交通训练营 | Lesson 4
  19. java-php-python-springboot志愿者服务平台计算机毕业设计
  20. 用selenium在python下实现批量网页 截图

热门文章

  1. java.lang.IllegalStateException: Web app root system property already set to different value: 'webap
  2. 魔方渗透系统安装教程
  3. [转贴]八岁女童墓志铭:我来过,我很乖~~~~~ (是个人就流泪)
  4. mysql中on用法_详解mysql中的Using与On的用法
  5. html怎么做一个心形边框,使用CSS获取心形边框?
  6. 计算机版初中地理知识点总结,初中地理教学计划精选5篇汇总
  7. 工作之余,请IT人员开怀大笑吧
  8. Dynamics 365 On-premises Field Service的安装试用问题
  9. Part GeoAI----当ArcGIS遇上人工智能
  10. Datawhale_大数据0期