Все окна MDI активны

У меня странная проблема. У меня есть несколько окон MDI в QMainWindow и ловушка windowStateChanged() в одном из MDI, чтобы показать / скрыть стыковочный виджет. Здесь все отлично работает.

Но если я попытаюсь закрепить одно из этих окон (не добавляя его в 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 становятся постоянно активными, и я не могу поймать сигнал windowStateChanged. Преобразование окна MDI в простой виджет тоже не помогает.

В чем может быть проблема? Это ошибка Qt?

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

  mdiArea->addSubWindow(newMDI);
  newMDI->setMainWindow(this);
  newMDI->show();
  newMDI->raise();
  mdiArea->setActiveSubWindow(newMDI);

«это» - главное окно. Может ли этот виджет док-станции фокусироваться или что-то вроде этого при создании MDI?

Дополнительная информация: если я откреплю окно с древовидным виджетом, все снова будет работать нормально.


person Aleksey Kontsevich    schedule 31.03.2016    source источник


Ответы (1)


Мы нашли причину:

В 1-м окне MDI есть QwtPlot, для которого мы устанавливаем фокус:

mUi->plot->setFocus();

по созданию. Из моего 1-го окна MDI я создаю виджет док-станции с виджетом дерева в нем. Когда пользователь дважды щелкает элемент в этом древовидном виджете, 1-й слот окна mdi, связанный с сигналом двойного щелчка, создает новое окно MDI. Этот второй MDI также содержит QwtPlot, на котором мы также сосредоточили внимание при создании. В этом случае все окна MDI становятся активными, и я не могу поймать windowStateChanged сигнал.

Прокомментировали все setFocus() звонков, теперь работает нормально. В чем может быть проблема?

person Aleksey Kontsevich    schedule 10.05.2016