在启动时关闭QMainWindow?

时间:2010-03-01 15:20:52

标签: c++ qt

我有一个Qt应用程序,它使用QMainWindow派生类作为主UI。在启动时,我想进行一些安全检查,如果失败,则向用户显示一条消息并关闭主窗口。目前我在QMainWindow构造函数中进行了这些检查,但是如果我调用close方法,则没有任何反应,应用程序继续运行。例如:

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();
    }
}

或者我可以在main函数中进行检查,但后来我失去了显示特定于语言的消息框的能力(tr宏仅适用于QObject派生类的外观事情。)

有关如何在启动时关闭主窗口或使tr宏在QObject派生类之外工作的任何想法?

4 个答案:

答案 0 :(得分:23)

在成功关闭主窗口之前,需要运行事件循环。由于您可能首先构造一个窗口,然后启动事件循环,close()调用无效。请尝试以下解决方案:

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

一旦启动了事件循环,QTimer::singleShot()就会触发,然后在应用程序主窗口中调用close()方法。

上述解决方案可能会导致您的主应用程序窗口在短时间内可见,从而导致不必要的闪烁。

更清洁的解决方案应在构建主窗口之前执行安全检查。由于tr()QObject上也可用作静态方法,因此可以从main函数中完成。

答案 1 :(得分:2)

tr是QObject的public static member。您应该可以在主要功能中拨打QObject::tr("Error")

答案 2 :(得分:2)

大多数应用程序分三步启动:1)构建窗口; 2)显示窗口; 3)启动事件循环。您可以通过将窗口构造函数设置的标志添加到窗口类来使步骤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_;
} 

申请代码:

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。

之前结束

答案 3 :(得分:0)

你有没有尝试过第一次隐藏()窗口(当调用close()时应该会发生这种情况)看看是否允许close()来破坏窗口。

如果这不起作用,你总是可以试着破坏(真实,真实)窗口以及任何子窗口。