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

最后说一下自己使用terminate()关闭线程:

MainWindow

connect(ui.RECVpushButton,SIGNAL(clicked()),this,SLOT(test()));
connect(&tcpThread,SIGNAL(SignalRecv()),this,SLOT(receNetConnect()));

connect(ui.STOPpushButton,SIGNAL(clicked()),this,SLOT(Stop()));

void MainWindow::receNetConnect()
{
tcpipLink.TCPIPRecvData();
//tcpipLink.TCPIPCheck();
data[0]=tcpipLink.recvbuf[0];
data[1]=tcpipLink.recvbuf[1];
data[2]=tcpipLink.recvbuf[2];
data[3]=tcpipLink.recvbuf[3];
data[4]=tcpipLink.recvbuf[4];
data[5]=tcpipLink.recvbuf[5];
data[6]=tcpipLink.recvbuf[6];
data[7]=tcpipLink.recvbuf[7];
data[8]=tcpipLink.recvbuf[8];
data[9]=tcpipLink.recvbuf[9];
data[10]=tcpipLink.recvbuf[10];
//第二种赋值 利用数组
//data[0]=tcpipLink.dddd[0];
//data[1]=tcpipLink.dddd[1];
//data[2]=tcpipLink.dddd[2];
//data[3]=tcpipLink.dddd[3];
//data[4]=tcpipLink.dddd[4];
//data[5]=tcpipLink.dddd[5];
s1 = QString::number(data[0],‘f‘,6);
s2 = QString::number(data[1],‘f‘,6);
s3 = QString::number(data[2],‘f‘,6);
s4 = QString::number(data[3],‘f‘,6);
s5 = QString::number(data[4],‘f‘,6);
s6 = QString::number(data[5],‘f‘,6);
s7 = QString::number(data[6],‘f‘,6);
s8 = QString::number(data[7],‘f‘,6);
s9 = QString::number(data[8],‘f‘,6);
s10 = QString::number(data[9],‘f‘,6);
s11 = QString::number(data[10],‘f‘,6);
ui.lineEdit->setText(s1);
ui.lineEdit_2->setText(s2);
ui.lineEdit_3->setText(s3);
ui.lineEdit_4->setText(s4);
ui.lineEdit_5->setText(s5);
ui.lineEdit_6->setText(s6);
ui.lineEdit_joint1->setText(s7);
ui.lineEdit_joint2->setText(s8);
ui.lineEdit_joint3->setText(s9);
ui.lineEdit_joint4->setText(s10);
ui.lineEdit_joint5->setText(s11);
}
void MainWindow::test()
{
tcpThread.start();
}

void MainWindow::Stop()
{
printf("it‘s stop!\n");
tcpThread.terminate();
}

ThreadTCP

void ThreadTCP::run()
{
//emit SignalLink();
//emit SignalRecv();
while(1)
{
if(m_stopFlag==false)
{
break;
}
printf("OK!\n");
Sleep(400);
emit SignalRecv();
}
}

即可将该线程终止,并能继续接收数据!!!!!!!

时间: 2024-12-18 15:01:06

Qt学习经验之quit()、exit()、close()《转载》的相关文章

【转载】分享一些Qt学习资源,欢迎下载

资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在verycd下的,大家都知道verycd资源是很难下载的,尽管这样我还是很有耐心把它下载了,并把它们上传到网盘去,你们下载的时候就一定很快的. 1.资源名称:<Qt教学视频22讲>  资源介绍: 由丁林松老师主讲,很适合初学者学的,因为讲得很基础.  下载地址:http://pan.baidu.c

【qt学习002】各类位置信息和各类标准输入框

不得不吐(赞)槽(扬)一下<Linux窗口程序设计-Qt4精彩实例分析>,书中的示例基本上是不完整的,只给出了相应知识点的实现,若要完整地运行整个工程,这需要读者来添加其余代码.在添加代码的过程中,因为不熟,常常是战战兢兢的,查很多资料,然后才敢往上写点代码,有时候挺浪费时间的. 今天学示例3和4,各类位置信息,各类标准输入框. 在编译时遇见一个错误:undefined reference to vtable for. 查资料找到解决方法,先qmake然后再构建,再运行即可.虽然解决了这个问题

【qt学习005】搞不明白的布局

记录一下自己在布局这一章遇见的各种狗屎问题. 问题主要出现在布局最后一节:综合布局实例,类似于一个qq管理器的界面(见下图1).看见这个时,打算动手实现一下,于是开始写代码,写着写着发现不知道怎么写了,遇见一些无法解决的问题(问题中描述的布局类之间的关系见下图2): 1. 最底层应该使用哪一类? 2. 怎么将QListWidget加入到最底层? 3. 怎么往QStackWidget加入三个页面,每个页面代表不同的信息? 4. 怎么将QHBoxLayout中的CLOSE按钮连接到退出函数,要完整地

qt学习(一)qt三个文件函数的框架

学到点什么, 而不是复制着什么, 每天敲着别人给的代码,苦涩得改完bug, 就这样一天天的过去, 实质上并没有学到什么, 别人的思想只是拿来借鉴, 你的思想是好是坏都是你的, 不用急着抛弃自己. 从qt看看人家的思路. Qt编程思路: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 以下:xxx.h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

【qt学习】开篇

重新开始学习qt,在年前已经看过一些知识点,但毫无进展,始终停留在知识点的阶段,或许有qt考试的话,我可以考得不错.然而学习qt,更多的是为了实战应用,并将其变成自己的兵器. 开始学习之前,先说说早前的一个困惑--为什么学习qt?最初学习qt,是因为身边朋友的强烈推荐,他说通过学习图形界面编程可以提高c++编程能力,而图形界面编程无非两种,一种MFC,另一种就qt了,MFC极其变态,想要简单快速,就学qt吧,于是我就开始看qt了.没过多久我有些动摇了,随着互联网时代的来临,编程方式正在慢慢改变,

Android 学习经验之分享

刚学Android开发的人肯定想知道过来人是怎样入门的,有哪些Android学习经验,怎样能少走弯路.下面小编就跟大家分享一下自己当初学Android的入门经验,虽算不上经典,但都是真正讲出了自己的学习过程,尽管每个人的学习方法和习惯等不同,但或许也可以从中学到东西. 一.看Android开发视频: 我刚开始接触android的时候,主要是跟着网上Android开发视频入的门,自己跟着一点一点的敲代码,就这样算是简单的入门,现在很多在线学习视频网站上面有很多的Android视频课程学习资源,记得

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

QT学习教程

原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt5入门学习,最近正在参考,转载希望更多人看到,也为自己以后找到本资料提供方便. Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 MainWindow 简介 添加动作 资源文件 对象模型 布局管理器 菜单栏.工具栏和状态栏 对话框简介 对话框

《Python学习手册》读书笔记【转载】

转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书