繁体   English   中英

为什么close()仅在一种方法中起作用而不在另一种方法中起作用?

[英]Why does close() only work in one method and not the other?

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void test();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

void MainWindow::test()
{
    close(); // Line 1
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    close(); // Line 2
}

main.cpp:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.test();

    return a.exec();
}

如果我注释掉第2行中的close(),则第1行中的close()会关闭窗口并使应用程序运行。

如果我注释掉第1行中的close(),则第2行中的close()将关闭窗口并结束应用程序。

为什么这种行为会有差异?

这样做的原因是w.test()调用是在事件循环开始之前被调用的( a.exec() ),因此不会引起任何其他可能与QMainWindow close()操作有关的事件发生。

在第二种方法中,将在事件循环开始后调用close()函数,更好的说,是在事件循环内(单击按钮时,将分派给on_pushButton_clicked()方法, close()会通知您的应用程序需要结束。

为了在事件循环中运行test()函数,请使用单次计时器:

//Qt 4 - in Qt 5, you can work this out without helper slot:

class MainWindow: public QMainWindow{
    //...   
    void test();
    //...
public slots:
    void testHelper(){ test(); }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    QTimer::singleShot(0, &w, SLOT(testHelper()));

    return a.exec();
}

编辑

看来Qt5的新connect语法对您避免在此处避免额外的插槽[1]毫无帮助

Qt5具有新的连接语法,该语法允许使用lambda,而同时又缺少能够使用lambda的QtConcurrent QTimer或更具体地说QTimer :: singleShot()。 对QTimer :: singleShot()也具有函数指针语法和lambda支持将是方便(且一致)的。

编辑2

更准确地说,当您调用QMainWindow::close() ,会引发QMainWindow::closeEvent(QCloseEvent *)事件,通常应在当前事件循环中对其进行处理。 由于在调用close没有事件循环,因此不会捕获此事件,并且不会导致应用程序退出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM