2013-04-26 50 views
1

mainwindow.h:为什么close()只能用一种方法工作,而不能用另一种方法工作?

#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行中关闭窗口并使应用程序运行。

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

为什么这种行为上的差异?

回答

0

之所以这样,是之前的事件循环已经开始(a.exec()w.test()调用被调用,因此它不会造成任何其它事件发生可能涉及到的QMainWindowclose()操作。

在第二种方法中,经过事件循环已经开始您的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表达式和QtConcurrent已经beeing能够使用lambda表达式QTimer以上的特别是QTimer :: singleShot()缺乏。 为QTimer :: singleShot()提供函数指针语法和lambda支持也很方便(并且一致)。

编辑2

更确切地说,当你调用QMainWindow::close()QMainWindow::closeEvent(QCloseEvent *)事件引发的,通常应该在当前事件循环处理。由于在调用close时没有事件循环,因此此事件不会被捕获,也不会导致应用程序退出。

+0

谢谢你的解释,而不仅仅是提供解决方案。 – user2317537 2013-04-26 19:11:24

相关问题