2013-04-26 70 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

相關問題