C++ Qt中的多窗口应用

C++ Qt中的多窗口应用,c++,qt,C++,Qt,在Qt中创建具有多个窗口的应用程序的好方法是什么?类似GIMP的东西。我已经阅读了答案,它不是我需要的 我有两个窗口,一个带有控件,另一个内部带有OpenGL。现在我有这样的事情: int main() { // some code MainWindow mw; mw.show(); GLWindow gw; gw.show(); // ... } 我不喜欢这个有两个原因。第一个原因是,当我启动应用程序时,带有OpenGL的窗口将位于顶部(

在Qt中创建具有多个窗口的应用程序的好方法是什么?类似GIMP的东西。我已经阅读了答案,它不是我需要的

我有两个窗口,一个带有控件,另一个内部带有OpenGL。现在我有这样的事情:

int main()
{
    // some code

    MainWindow mw;
    mw.show();

    GLWindow gw;
    gw.show();

    // ...
}
我不喜欢这个有两个原因。第一个原因是,当我启动应用程序时,带有OpenGL的窗口将位于顶部(因为它是最后一个调用
show()
),但
MainWindow
将隐藏在所有打开的窗口下的某个地方。我需要的是所有东西前面的两个窗口(比如GIMP),最好是集中在
主窗口上(我想我可以把它们放在前面,所以这是个小问题)。我不喜欢这一点的第二个原因是,只有在关闭两个窗口时,我的应用程序才会完全关闭

所以我想在
MainWindow
中引用
GLWindow
,然后从
MainWindow
创建

这是创建具有多个窗口的应用程序的好方法吗


编辑:GLWindow继承自QOpenGLWindow。

我不确定自己是否完全理解这种情况,但通常,您可以将“次要”窗口小部件作为
QMainWindow的子窗口。给出您的示例代码,类似于

int main ()
{
    // some code

    MainWindow mw;
    mw.show();

    /*
     * Secondary windows should be created with the QMainWindow mw
     * as their parent.
     */
    GLWindow gw(&mw);

    /*
     * Set the Qt::Dlaog window flag to `encourage' the QMainWindow
     * and its children to behave as a group.
     */
    gw.setWindowFlags(gw.windowFlags() | Qt::Dialog);
    gw.show();

    // ...
}

现在,所有小部件都作为一个组运行(可能取决于正在使用的窗口管理器),关闭
QMainWindow
默认情况下将关闭应用程序。

我不确定自己是否完全理解这种情况,但通常,您可以将“次要”小部件设置为
QMainWindow
的子部件。给出您的示例代码,类似于

int main ()
{
    // some code

    MainWindow mw;
    mw.show();

    /*
     * Secondary windows should be created with the QMainWindow mw
     * as their parent.
     */
    GLWindow gw(&mw);

    /*
     * Set the Qt::Dlaog window flag to `encourage' the QMainWindow
     * and its children to behave as a group.
     */
    gw.setWindowFlags(gw.windowFlags() | Qt::Dialog);
    gw.show();

    // ...
}

现在,所有小部件都作为一个组运行(可能取决于正在使用的窗口管理器),关闭
QMainWindow
默认情况下将关闭应用程序。

您做得不错,但通过以下简单技巧,您可以解决导致您不喜欢正确方法的两个问题:

  • 要激活两个窗口,只需执行以下操作:
  • 要解决退出问题,必须覆盖两个窗口中的
    closeEvent
    。为此,将以下代码添加到两个窗口的头文件中:
  • 在closeEvent的实现中,只需编写
    qApp->quit()。这样,一旦关闭任一窗口,应用程序将完全终止

    main window.cpp

    void MainWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    
    void GLWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    

    GLWindow.cpp

    void MainWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    
    void GLWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    

    您的做法是正确的,但通过以下简单技巧,您可以解决导致您不喜欢正确方法的两个问题:

  • 要激活两个窗口,只需执行以下操作:
  • 要解决退出问题,必须覆盖两个窗口中的
    closeEvent
    。为此,将以下代码添加到两个窗口的头文件中:
  • 在closeEvent的实现中,只需编写
    qApp->quit()。这样,一旦关闭任一窗口,应用程序将完全终止

    main window.cpp

    void MainWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    
    void GLWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    

    GLWindow.cpp

    void MainWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    
    void GLWindow::closeEvent(QCloseEvent *event)
    {
        qApp->quit();
    }
    

    您计划与多个opengl视图或单个视图共享控件窗口吗?@Damien LEFEVRE single one。您选择浮动对话框(非模态)上的辅助QMainWindow是否有特殊原因。我不太确定你需要实现什么,所以很难给出建议:)但如果可能的话,我会用它。将主窗口作为对话框的父窗口,以确保它位于顶部。它不是辅助QMainWindow,此类GLWindow继承自QOpenGLWindow。您计划将控件窗口与多个opengl视图或单个视图共享吗?@Damien LEFEVRE single one。您选择辅助QMainWindow而不是浮动对话框(非模态)有什么特殊原因吗。我不太确定你需要实现什么,所以很难给出建议:)但如果可能的话,我会用它。将主窗口作为对话框的父窗口,以确保它位于顶部。它不是辅助QMainWindow,此类GLWindow继承自QOpenGLWindow。我已将编辑添加到问题中。GLWindow继承自QOpenGLWindow。这就是有关OpenGL的事情发生的地方。另一个窗口是QMainWindow,其中有控件。我希望这能澄清问题。@dosvarog我不明白这会改变什么。你说你不完全了解情况,所以我想这会澄清问题。GLWindow继承自QOpenGLWindow,因此它属于QWindow类型。主窗口的类型为QMainWindow。所以,我有两个窗口,应该作为一个应用程序。我将尝试使用您的建议在GLWindow中使用此标志进行“提示”。我已将编辑添加到我的问题中。GLWindow继承自QOpenGLWindow。这就是有关OpenGL的事情发生的地方。另一个窗口是QMainWindow,其中有控件。我希望这能澄清问题。@dosvarog我不明白这会改变什么。你说你不完全了解情况,所以我想这会澄清问题。GLWindow继承自QOpenGLWindow,因此它属于QWindow类型。主窗口的类型为QMainWindow。所以,我有两个窗口,应该作为一个应用程序。我会尝试用你的建议在GLWindow上用这个标志“提示”。