Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: AlekseyK от Март 31, 2016, 15:22



Название: Все MDI окна активны
Отправлено: AlekseyK от Март 31, 2016, 15:22
Натолкнулся на странный баг.  У меня есть несколько MDI окон в QMainWindow. В одном из них я перехватываю сигнал windowStateChanged() для того, чтобы показать/спрятать прикреплённый виджет (docking widget). Всё работает прекрасно. Однако, если я пытаюсь поместить одно из этих окон в док (не добавляя его при этом в mdiArea()),

Код
C++ (Qt)
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 окна становятся активными постоянно, и я не могу перехватить сигнал windowStateChanged. Преобразование этого MDI окна в простой QWidget также не помогает. В чём может быть причина? Баг Qt?

Новая информация: myMDIWindow содержит tree widget и по двойному нажатию на нём эмитирует сигнал, подключённый к mdi окну, которое создало его (назовём его 1-е mdi окно). Этот сигнал подсоединён к слоту, который создаёт новое MDI окно, в зависимости от того, куда пользователь кликнет в списке tree widget. В этом случае все mdi окна становятся активными. Если же создать MDI окно нажатием кнопки в 1-м mdi окне - всё опять приходит в норму. Код создания mdi окна один и тот же в обоих случаях:

Код
C++ (Qt)
 mdiArea->addSubWindow(newMDI);
 newMDI->setMainWindow(this);
 newMDI->show();
 newMDI->raise();
 mdiArea->setActiveSubWindow(newMDI);
 

"this" -это main window. Может быть причина в том, что dock widget имеет фокус или что-то в этом роде во время создания mdi окна?

Ещё: если отцепить окно с tree widget от дока - всё опять работает нормально.