代码之家  ›  专栏  ›  技术社区  ›  Rob

是否在启动时关闭QMainWindow?

  •  9
  • Rob  · 技术社区  · 15 年前

    我有一个使用 QMainWindow 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 回复  |  直到 15 年前
        1
  •  29
  •   Ton van den Heuvel    14 年前

    在成功关闭主窗口之前,需要运行事件循环。因为您可能首先构造一个窗口,然后启动事件循环 close()

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

    这个 QTimer::singleShot() 关闭() 方法在应用程序主窗口上。

    在构建主窗口之前,应使用更干净的解决方案执行安全检查。自从 tr() QObject ,这可以从主功能中完成。

        2
  •  3
  •   Phil Tresadern    13 年前

    大多数应用程序的启动分为三个步骤:1)构造窗口;2) 显示窗口;3) 启动事件循环。通过向窗口类添加一个标志(其值由窗口构造函数设置),可以使步骤2和步骤3以步骤1的成功为条件:

    窗口类:

    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
    }
    

        3
  •  2
  •   Mathias Soeken    15 年前

    tr 是一个 public static member 关于QObject。你应该可以打电话 QObject::tr("Error")

        4
  •  0
  •   Ali Lown    15 年前

    您是否尝试过先隐藏()窗口(调用close()时无论如何都会发生这种情况),以查看这是否允许close()破坏窗口。

    如果这不起作用,您可以尝试销毁(true,true)窗口以及任何子窗口。