![](/img/trans.png)
[英]Writing compile time recursively resolved types in C++: why does one method work and the other fails?
[英]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.