2010-03-01 267 views
8

我有一個Qt應用程序,它使用QMainWindow派生類作爲主UI。在啓動時,我想進行一些安全檢查,如果失敗,則向用戶顯示一條消息並關閉主窗口。目前,我在QMainWindow構造函數中進行這些檢查,但如果我調用close方法,則不會發生任何事情,並且應用程序會繼續運行。例如:啓動時關閉QMainWindow?

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    setupUi(this); 
    ... 
    if (checkFails()) 
    { 
     QMessageBox::warning(this, tr("Error"), tr("You cannot run this app")); 
     // This has no effect 
     close(); 
    } 
} 

我也可以做檢查的主要功能,但後來我失去顯示特定語言的消息框(該tr宏只在QObject派生類的的外觀作品的能力)

有關如何在啓動時關閉主窗口或使tr宏在QObject派生類之外工作的任何想法?

回答

23

在成功關閉主窗口之前,需要先運行事件循環。由於您可能先構建一個窗口,然後啓動事件循環,則close()調用不起作用。請嘗試以下方法,而不是:

QTimer::singleShot(0, this, SLOT(close())); 

QTimer::singleShot()將作爲一個事件循環已經開始,一旦火了,隨後調用您的應用程序主窗口的close()方法。

上述解決方案可能會導致您的主應用程序窗口在短時間內可見,導致不必要的閃爍。

清潔解決方案應該在構建主窗口之前執行安全檢查。由於tr()也可用作QObject的靜態方法,因此可以從主函數完成此操作。

2

tr是QObject的public static member。您應該可以在主要功能中調用QObject::tr("Error")

0

您是否嘗試過先隱藏窗口(當調用close()時會發生這種情況),以查看是否允許close()銷燬窗口。

如果這不起作用,您可以隨時嘗試銷燬(true,true)窗口以及任何子窗口。

2

大多數應用程序啓動分三步:1)構造窗口; 2)顯示窗口; 3)啓動事件循環。

窗口類:

class myMainWindowClass : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    myMainWindowClass() 
    : isFinished_(false) { if (error) isFinished_ = true; } // constructor 

    bool isFinished() const { return isFinished_; } 
private: 
    bool isFinished_; 
} 

應用程序代碼可以通過添加一個標誌,其值由該窗口構造設置,以窗口類使步驟2和3的步驟1的成功條件:

int main() 
{ 
    myMainWindowClass main_window(); // Step 1 

    // Finish early if isFinished flag is set 
    if (main_window.isFinished()) 
     return 0; 

    main_window.show(); // Step 2 
    return a.exec(); // Step 3 
} 

這也應該避免任何閃爍,因爲應用程序將在窗口show()n之前結束。