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