2010-03-01 142 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之前结束。