Хорошо, у меня есть графический интерфейс Qt 4.8.7, запущенный в приложении Eclipse RCP из плагина Java.У меня есть QMainWindow, созданное org.eclipse.swt.widgets.Composite и отображенное в org.eclipse.ui.part.EditorPart.Я использую интерфейс IStartup для выделения объекта QApplication при запуске приложения Eclipse с помощью вызова JNI в потоке графического интерфейса Java, т.е. Display.getDefault (). SyncExec (new Runnable () {... Интересно, вызывая exec () для QApplicationобъект не требуется, поскольку очередь событий Qt, кажется, успешно обрабатывается после выделения QApplication.
Удивительно, но это работает без проблем в 64-битной Windows 7/8. Однако, когда я беру точно такую же сборкуи запустить его в 64-битной Windows 10, события Qt, похоже, застряли. Например, скажем, у меня есть столбец непроверенных виджетов QCheckBox в моем QMainWindow (внутри Composite, внутри EditorPart, внутри приложения Eclipse RCP), и я запускаюпроверяя их, кажется, ничего не происходит, но когда я полностью щелкаю за пределами приложения Eclipse RCP, как на панели задач, все проверенные мной QCheckBox будут затем проверяться.
Странно, да? Есть идеи о том, что изменилосьмежду Windows 7/8 и 10?
Позвольте мне повторить. Это работает безупречно на Windдолжен 7/8 64-битный.Проблема под Windows 10 64-битная.К сожалению, я не могу поделиться кодом.Кроме того, я понимаю, что то, что я сделал здесь, немного безумно, но это то, что он есть, потому что наследие.
Спасибо!
Обновление:
Я думаю, что сузил проблему до события QEvent :: UpdateRequest.Вот распечатка обычных операций после события вокруг:
52686 painting\qbackingstore.cpp 537 sendUpdateRequest QEvent::UpdateRequest
52687 kernel\qapplication.cpp 3897 QApplication::notify QEvent::UpdateRequest
52688 kernel\qwidget.cpp 8693 QWidget::event QEvent::UpdateRequest
52689 kernel\qapplication.cpp 3897 QApplication::notify QEvent::UpdateRequest
Но когда что-то застряло, распечатка просто останавливается после вызова sendUpdateRequest (), то есть
52974 painting\qbackingstore.cpp 537 sendUpdateRequest QEvent::UpdateRequest
Наведение мыши/ tracking / click события все еще проходят, но это событие как будто застряло.И я говорю «застрял» специально, потому что, как я уже говорил, когда я нажимаю за пределами приложения, событие, кажется, отрывается, и тогда происходит ожидаемое поведение, то есть
52975 kernel\qapplication.cpp 3897 QApplication::notify QEvent::UpdateRequest
52976 kernel\qwidget.cpp 8693 QWidget::event QEvent::UpdateRequest
52977 kernel\qapplication.cpp 3897 QApplication::notify QEvent::UpdateRequest
Обновление 2:
Я должен добавить, что виджет QtWinMigrate (из Qt / MFC Migration Framework ) используется для облегчения встраивания в org.eclipse.swt.widgets.Composite.
Обновление 3:
Воспроизводится на 100% при запуске модального QDialog.Есть ли что-то полезное в QDialog?Разве у QDialog нет своего маленького цикла событий?Это мне что-нибудь говорит?
Обновление 4:
Мне удалось запустить сеанс удаленной отладки Visual Studio, что позволило приложению сохранять фокус, когда я нажимаю на свое условиеточка останова «event-> t == QEvent :: UpdateRequest» в qcoreapplication.cpp (1405): QCoreApplication :: postEvent ().Оттуда вызывается метод PostMessage API-интерфейса WIN32 (d-> internalHwnd, WM_QT_SENDPOSTEDEVENTS, 0, 0).Затем я смог выяснить, что выполнение застревает в цикле while в qeventdispatcher_win.cpp (721): QEventDispatcherWin32 :: processEvents ().Я думаю, что это застревает из-за «продолжения» в строке 801, то есть
if (d->internalHwnd == msg.hwnd && msg.message == WM_QT_SENDPOSTEDEVENTS) {
if (seenWM_QT_SENDPOSTEDEVENTS) {
// when calling processEvents() "manually", we only want to send posted
// events once
needWM_QT_SENDPOSTEDEVENTS = true;
continue;
}
seenWM_QT_SENDPOSTEDEVENTS = true;
}
Я не знаю, почему это происходит.Я не знаю, почему поведение в QDialog отличается от QMainWindow.Все, что я могу сказать, это то, что я прокомментировал это «продолжить», и проблема исчезла.Кто-нибудь может даже начать объяснять мне это?
Обновление 5:
Разница между Win7 и Win10 заключается в том, что на Win7, в qeventdispatcher_win.cpp (784),
waitRet = MsgWaitForMultipleObjectsEx(nCount, pHandles, 0, QS_ALLINPUT, MWMO_ALERTABLE);
, цикл прерывается, и processEvents может завершиться.На Win10 MsgWaitForMultipleObjectsEx () никогда не прерывается.Постоянно приходят сообщения, большинство из которых WM_QT_SENDPOSTEDEVENTS.
Может кто-нибудь объяснить это, пожалуйста?