所有 MDI windows 都处于活动状态
All MDI windows are active
我遇到了一个奇怪的问题。我在 QMainWindow
中有一些 MDI windows 并在其中一个 MDI 中捕获 windowStateChanged()
到 show/hide 对接小部件。这里一切正常。
但是如果我尝试像这样将其中一个 window 停靠(而不是将其添加到 mdiArea()
):
myMDIWindow->setWindowFlags(Qt::Widget | Qt::CustomizeWindowHint |
Qt::FramelessWindowHint);
// Create dock window and put my mdi window into it
QDockWidget *dock = new QDockWidget(myMDIWindow->windowTitle(), this);
dock->setFloating(true);
dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::RightDockWidgetArea);
dock->setWidget(myMDIWindow); // Wrap mdi window into dock
mainWindow()->addDockWidget(Qt::RightDockWidgetArea, dock);
然后所有其他 MDI windows 变得持续活跃,我无法捕捉到 windowStateChanged
信号。将 MDI window 转换为简单的小部件也无济于事。
这可能是什么问题?这是 Qt 错误吗?
新信息: 带有树形小部件的 myMDIWindow 有信号连接到创建它的 mdi window(让我们先称它为 mdi window)。此信号连接到根据用户双击此树形小部件创建新 MDI window 的插槽。在这种情况下,所有 mdi windows 都被激活。如果我通过单击第一个 mdi window 中的按钮创建 MDI window - 一切都会再次正常。创建 mdi window 的代码在两种情况下都是相同的:
mdiArea->addSubWindow(newMDI);
newMDI->setMainWindow(this);
newMDI->show();
newMDI->raise();
mdiArea->setActiveSubWindow(newMDI);
"this" 是主要的 window。这可能是停靠小部件在 mdi 创建上有焦点或类似这样的事情吗?
更多信息: 如果我取消 window 与树小部件的停靠,一切都会再次正常工作。
我们找到了原因:
第一个 MDI window 有 QwtPlot
我们为其设置焦点:
mUi->plot->setFocus();
关于创作。从我的第一个 MDI window 我创建了一个带有树形小部件的停靠小部件。当用户双击此树形小部件中的项目时,连接到双击信号的第一个 mdi window 插槽会创建新的 MDI window。第二个 MDI 还包含 QwtPlot
,我们将重点放在创建上。在这种情况下,所有 MDI windows 都处于活动状态,我无法捕捉到 windowStateChanged
信号。
现在我们评论了所有 setFocus()
个调用,现在工作正常。这可能是什么问题?
我遇到了一个奇怪的问题。我在 QMainWindow
中有一些 MDI windows 并在其中一个 MDI 中捕获 windowStateChanged()
到 show/hide 对接小部件。这里一切正常。
但是如果我尝试像这样将其中一个 window 停靠(而不是将其添加到 mdiArea()
):
myMDIWindow->setWindowFlags(Qt::Widget | Qt::CustomizeWindowHint |
Qt::FramelessWindowHint);
// Create dock window and put my mdi window into it
QDockWidget *dock = new QDockWidget(myMDIWindow->windowTitle(), this);
dock->setFloating(true);
dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::RightDockWidgetArea);
dock->setWidget(myMDIWindow); // Wrap mdi window into dock
mainWindow()->addDockWidget(Qt::RightDockWidgetArea, dock);
然后所有其他 MDI windows 变得持续活跃,我无法捕捉到 windowStateChanged
信号。将 MDI window 转换为简单的小部件也无济于事。
这可能是什么问题?这是 Qt 错误吗?
新信息: 带有树形小部件的 myMDIWindow 有信号连接到创建它的 mdi window(让我们先称它为 mdi window)。此信号连接到根据用户双击此树形小部件创建新 MDI window 的插槽。在这种情况下,所有 mdi windows 都被激活。如果我通过单击第一个 mdi window 中的按钮创建 MDI window - 一切都会再次正常。创建 mdi window 的代码在两种情况下都是相同的:
mdiArea->addSubWindow(newMDI);
newMDI->setMainWindow(this);
newMDI->show();
newMDI->raise();
mdiArea->setActiveSubWindow(newMDI);
"this" 是主要的 window。这可能是停靠小部件在 mdi 创建上有焦点或类似这样的事情吗?
更多信息: 如果我取消 window 与树小部件的停靠,一切都会再次正常工作。
我们找到了原因:
第一个 MDI window 有 QwtPlot
我们为其设置焦点:
mUi->plot->setFocus();
关于创作。从我的第一个 MDI window 我创建了一个带有树形小部件的停靠小部件。当用户双击此树形小部件中的项目时,连接到双击信号的第一个 mdi window 插槽会创建新的 MDI window。第二个 MDI 还包含 QwtPlot
,我们将重点放在创建上。在这种情况下,所有 MDI windows 都处于活动状态,我无法捕捉到 windowStateChanged
信号。
现在我们评论了所有 setFocus()
个调用,现在工作正常。这可能是什么问题?