精华内容
下载资源
问答
  • 本文主要总结在关闭qt的QWidget子窗口瞬间,执行特定代码。...第一种方法是关闭窗口时调用窗口的析构函数,直接在构造函数添加如下代码,然后就可以调用子窗口析构函数了。setAttribute(Qt::WA_DeleteOnClose);第二...

    本文主要总结在关闭qt的QWidget子窗口瞬间,执行特定代码。由于主窗口关闭时,会自动执行析构函数,而子窗口关闭时,却不会调用析构函数,进过博主查阅资料,发现有两种方法可以在子窗口关闭时,调用析构函数或者执行一个关闭函数。

    第一种方法是关闭窗口时调用窗口的析构函数,直接在构造函数添加如下代码,然后就可以调用子窗口析构函数了。

    setAttribute(Qt::WA_DeleteOnClose);

    第二种方法是调用QCloseEvent类。当窗口关闭瞬间,会发射一个关闭信号,调用槽函数void closeEvent(QCloseEvent* event);只需要重写该虚函数,在里面写入需要执行的特定代码就可以满足要求。只需要在需要关闭的窗口重写虚函数closeEvent(),在关闭该窗口瞬间,会自动调用该虚函数。该方法不会收其它窗口影响,也即是其它窗口关闭,不会调用这个窗口的closeEvent()虚函数。只会在该窗口类起作用。具体的代码用法如下所示:

    #include

    protected:

    void closeEvent(QCloseEvent* event);

    void Widget::closeEvent(QCloseEvent *event)

    {

    Q_UNUSED(event);

    qDebug("关闭了窗口");

    }

    展开全文
  • 1.用的信号/槽实现在main函数中将QApplication::lastWindowClosed()信号和QApplication::quit()槽函数相关联a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );voidQApplication::...

    1.用的信号/槽实现

    在main函数中将QApplication::lastWindowClosed()信号和QApplication::quit()槽函数相关联

    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );

    void QApplication::lastWindowClosed () [signal]  后面有QT助手的解释,

    明显没有我的方法简单方便

    2. 设置窗口参数 Qt::WA_QuitOnClose attribute,为true 的所有窗口关闭后程序退出.

    主窗口设置属性Qt::WA_QuitOnClose

    w.setAttribute(Qt::WA_QuitOnClose,true);其他窗口

    XX.setAttribute(Qt::WA_QuitOnClose,false);

    这样关闭主窗口的时候,主程序就会退出,其他窗口也会关闭。

    3.这两步就完成了任务.不过为了方便,我们可以把其他窗口类的构造函数中加一句

    setAttribute(Qt::WA_QuitOnClose,false);

    就不用为每个生成的窗体添加属性了.

    4. 再进一步,我们分析一下QT源码

    void QApplication::setQuitOnLastWindowClosed(bool quit){QApplicationPrivate::quitOnLastWindowClosed = quit;}setQuitOnLastWindowClosed(bool quit)函数也就是设置了一下QApplicationPrivate::quitOnLastWindowClosed这个值.然后

    void QApplicationPrivate::emitLastWindowClosed(){if (qApp && qApp->d_func()->in_exec) {if (QApplicationPrivate::quitOnLastWindowClosed) {// get ready to quit, this event might be removed if the// event loop is re-entered, howeverQApplication::postEvent(qApp, new QEvent(QEvent::Quit));}emit qApp->lastWindowClosed();}}

    也发射了信号

    emit qApp->lastWindowClosed();所以两种方法其实是一样滴.

    下面是别人的总结

    主窗口设置属性Qt::WA_QuitOnClose

    w.setAttribute(Qt::WA_QuitOnClose,true);

    Qt::WA_QuitOnClose属性是使窗口如果是最后一个关闭的时候触发事件lastWindowClosed();

    然后主程序收到事件退出

    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );

    现在问题是自己定义的子窗口打开的时候,它们默认Qt::WA_QuitOnClose也是true,所以如果主窗口关闭的时候有别的窗口开着,(除了一些暂时性的窗口——如启动界面、工具窗口、弹出菜单)程序还是不会退出,而是等到最后一个窗口关闭之后才退出。

    所以现在要把别的窗口的Qt::WA_QuitOnClose设为false。

    XX.setAttribute(Qt::WA_QuitOnClose,false);

    这样关闭主窗口的时候,主程序就会退出,其他窗口也会关闭。

    qt助手中的解释:

    void QApplication::lastWindowClosed () [signal]

    This signal is emitted from QApplication::exec() when the last visible primary window (i.e. window with no parent) with the Qt::WA_QuitOnClose attribute set is closed.

    By default,this attribute is set for all widgets except transient windows such as splash screens, tool windows, and popup menus

    QApplication implicitly quits when this signal is emitted.

    This feature can be turned off by setting quitOnLastWindowClosed to false.

    展开全文
  • 主要就是重写了一个closeEvent函数达到的效果,转载自 :CSDN-专业IT技术社区-登录​blog.csdn.net# -*- coting: UTF-8 -*- import sys from PyQt5 import QtCore from PyQt5.QtWidgets import (QWidget, ...

    主要就是重写了一个closeEvent函数达到的效果,

    转载自 :

    CSDN-专业IT技术社区-登录blog.csdn.net
    # -*- coting: UTF-8 -*-
    import sys
    
    from PyQt5 import QtCore
    from PyQt5.QtWidgets import (QWidget, QPushButton, QApplication, QDesktopWidget, QMessageBox)
    from PyQt5.QtCore import QCoreApplication
    
    
    class Example(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            bt = QPushButton("退出", self)
            # 按钮的点击事件关联QCoreApplication.instance().quit退出
            bt.clicked.connect(QCoreApplication.instance().quit)
            bt.resize(bt.sizeHint())
            bt.move(50, 50)
    
            # 窗口显示在屏幕中间
            self.center()
            self.setWindowTitle("quit")
            self.show()
    
        # 显示窗口在屏幕中间
        def center(self):
            # 获得窗口
            qr = self.frameGeometry()
            # 获得屏幕中心点
            cp = QDesktopWidget().availableGeometry().center()
    
            # 显示到屏幕中心
            qr.moveCenter(cp)
            self.move(qr.topLeft())
    
        # 我们关闭窗口的时候,触发了QCloseEvent。我们需要重写closeEvent()事件处理程序。
        # 重写closeEvent函数,使点击右上角的叉号关闭按钮时,弹框提示“Are you sure to quit?”
        def closeEvent(self, event):
            # 我们显示一个消息框,两个按钮:“是”和“不是”。第一个字符串出现在titlebar。
            # 第二个字符串消息对话框中显示的文本。第三个参数指定按钮的组合出现在对话框中。
            # 最后一个参数是默认按钮,这个是默认的按钮焦点。
            reply = QMessageBox.question(self, 'Message',
                                         "Are you sure to quit?", QMessageBox.Yes |
                                         QMessageBox.No, QMessageBox.No)
            # 处理返回值,如果单击Yes按钮,关闭小部件并终止应用程序。否则我们忽略关闭事件。
            if reply == QMessageBox.Yes:
                event.accept()
            else:
                event.ignore()
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec())
    

    效果:

    ba4f0def526608ee2d8ea0f78e632c3a.png
    展开全文
  • QT中 quit(),exit()以及close():常用的三个槽对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用。只是应注意二者调用的方式不同。如下程序示例:{QApplication...

    23333 QT一坨,求一门面向傻瓜的语言。

    QT中 quit(),exit()以及close():常用的三个槽

    对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用。只是应注意二者调用的方式不同。如下程序示例:

    {

    QApplication*app;

    app->exit(0);

    }

    或者:

    {

    QApplication*app;

    app->quit();

    }

    View Code

    此时二者是等价的,即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();

    }

    View Code

    其中通过一条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;

    }

    }

    View Code

    编译程序后,系统会在用户响应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 = newABMainWindow();

    mw->setCaption( "Qt Example - Addressbook");

    a.setMainWidget( mw );

    mw->show();

    a.connect(&a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );int result =a.exec();deletemw;returnresult;

    }

    View Code

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

    展开全文
  • # QT-信号槽(点击按钮关闭窗口)​ 其实也就是mfc下的响应是一个意思信号发送者 发送信号 信号接收者 处理信号就是这样一个流程那么信号发送者可以是很多的情况这里举例分析一个情况:点击按钮实现关闭窗口:信号发送...
  • 写程序遇到了QTimer启动以后可以在普通函数(例如槽函数)里面停止,但是无法在析构函数里...然后找了一篇讲“相应QT关闭窗口事件”的例子,摘抄如下。QDialog类下有一个虚函数void QDialog::closeEvent (QCloseEven...
  • 概念:创建控件时可以指定停靠在父窗口上,如果没有指定,则飘在外面形成独立的窗体,父窗口本质也是图形控件,常用于表示父窗口类主要包括如下三个:QWidgetQDialog(对话框)QMainWindow(主窗口)注:QWidget和它的...
  • 前几天分享了一个使用C#开发的串口上位机,那么今天教你如何100行QT代码实现一个串口上位机。如果你学习过C++,那么使用QT开发软件,就不是什么大问题了,QT很多时候使用在linux上。所以使用QT开发还是挺不过的选择...
  • 使用close()关闭窗口后,发现程序运行的过程中,如果发送了某一个信号,该信号链接过已经close()过窗口的槽,该槽函数会执行。 close()函数执行后该窗口的成员不会被析构,只是隐藏了这个窗口。 构造函数中加入: ...
  • QTimer::singleShot(0, qApp, SLOT(quit()));
  • 添加头文件 #include <QApplication> 此时在main.cpp的main函数中qApp是指向的窗口指针,可以调用此指针关闭窗口
  • QT窗口操作函数

    2017-03-25 10:30:38
    转自:... setWindowFlags(Qt::WindowCloseButtonHint);//哈哈窗口只有一个关闭按钮   使用方法:1: clientMainWindow::clientMainWindow(QWidget *parent) : QMainWind
  • 拦截QT关闭窗口的CloseEvent

    千次阅读 2012-04-29 11:14:07
    写程序遇到了QTimer启动以后可以在普通函数(例如槽函数)里面停止,但是无法在析构函数里停止的...然后找了一篇讲“相应QT关闭窗口事件”的例子,摘抄如下。 转自:http://blog.csdn.net/vah101/article/details/
  • QT 关闭窗口与资源释放问题

    千次阅读 2019-02-20 22:03:19
    对于使用指针,使用new创建的窗口,还可以使用QWidget::setAttribute方法来当窗口关闭后自动释放其占用的资源,而不用户显示的去调用delete释放,此方法当然也会调用窗口的析构函数: Widget *w = new ...
  • 子窗体的构造函数中初始化了父窗体的parent,当关闭子窗体时不会调用析构函数, 只有关闭父窗体时,才会调用子窗体的析构函数, 解决办法如下 setAttribute(Qt::WA_DeleteOnClose); 写在子窗体的构造函数就可以...
  • 在写程序时,UI、基础类库、应用程序框架对于vc来讲,只能依靠MFC和QT了。勇哥对MFC有很强的抵触,它长得丑,很多地方反人类,唯一的好处是VC原生自带的。所以还是先研究一下QT,再研究MFC吧,否则会带了很大的挫折...
  • 利用 exec() 函数,exec()函数解释如下: [virtual slot] int QDialog::exec() Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result. If the dialog...
  • Qt捕捉窗口关闭事件

    千次阅读 2019-05-18 21:53:46
    有时候我们希望在关闭窗口之前做一些操作,例如保存缓存数据或向用户提示是否关闭窗口等等。 由于一般的窗口都是继承自QWidget, 那么我们可以通过覆盖QWidget中的虚函数closeEvent(QCloseEvent* event);来达到这个...
  • 窗口右上角的X按键会导致其在不给出任何提示的情况下直接退出,当点击右上角的x按键时,会触发Qt中的一个事件处理函数:void QWidget::closeEvent ( QCloseEvent * e ),默认情况该函数无任何提示性消息,如果需提示...
  • Qt5窗口关闭窗口销毁

    万次阅读 2015-10-19 22:13:01
    学习记录不断更新 ...编写程序的时候,有些时候会用到窗口(QDialog、QWidget、MainWindow)的关闭事件,比如说点击窗口"x"按钮或者是一个关联close()槽函数的按钮,希望弹出消息框或者是关闭其他窗口等等 比如
  • QT中 quit(),exit()以及close():常用的三个槽对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用。只是应注意二者调用的方式不同。如下程序示例:{QApplication...
  • QT关闭应用程序和窗口函数

    千次阅读 2013-08-16 16:14:55
    QT关闭应用程序和窗口函数 使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的、种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用。关于窗口关闭的操作,在这里指出常用的...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 377
精华内容 150
关键字:

qt关闭窗口函数