2012-06-28 3 views
4

У меня есть приложение GUI, которое написано с использованием win API , и нам нужно запустить новое графическое приложение, когда пользователь выбирает некоторые пункты меню. Мы решили написать новое приложение в PyQt и запустить приложение PyQt usig Python C Api.Родительское окно, не получающее сообщения окна (ключевые события)

Все работает отлично, за исключением, что окно Родитель, через который мы запускаем PyQt приложение, не реагирует на некоторые события, когда приложение PyQt открыто. Как только мы закрываем приложение PyQt, он снова начинает отвечать на ключевые события.

Я предполагаю, что после запуска приложения PyQt Gui, как-то сообщения не передаются в родительское окно.

Осматривая с Spy ++ я нашел следующий результат:

Receives messages for: 
    - ALT key 
    - F1, F2 keys 
    - Mouse events 

Does NOT receive messages for: 
    - CTRL key 
    - All other Fn keys 
    - All letter keys 
    - SHIFT, CAPS keys 

Любые мысли, чтобы решить эту проблему, была бы оценена

+0

Значит, вы имеете в виду, что родительское окно не является виджетами Qt? Как вы запускаете QApplication? В отдельном потоке? Вы справляетесь с клавишами F1, F2 в приложении ur Qt? – blueskin

+0

Да родительское окно - это не QtWigget, полностью написанное с использованием окон C и WinAPI, а PyQt запускается путем встраивания интерпретатора python в этот C-код. – Maverick

+0

Ну QApplication должен быть запущен вызовом exec(), который является блокирующим вызовом, поэтому я предполагаю, что вы запускаете его в отдельном потоке. И я ожидаю, что ни один из нажатий клавиш не будет отправлен в родительское окно, поскольку это не родительский виджет окна PyQt. – blueskin

ответ

0

Я считаю, что вы пытаетесь сделать - работать два отдельных ГПИ в пределах один процесс - не поддерживается какой-либо основной операционной системой. Некоторое время назад я долго искал способы сделать это и никогда не встречал никаких советов, кроме «не надо».

Я удивлен, что недостающие ключи являются единственной проблемой, с которой вы сталкиваетесь. Я рекомендую найти другое решение, прежде чем вы обнаружите больше проблем (если не найдете хороших доказательств того, что это, по крайней мере, , предположительно для работы).

Возможно, вы создали новый процесс для запуска цикла событий Qt? Поскольку у вас уже есть встроенный python в основном процессе, это должно быть довольно просто - используйте встроенный IPC python для обработки связи между процессами.

+0

На самом деле у вас нет двух отдельных графических интерфейсов. В Windows Qt - это всего лишь оболочка API Win32. Эти два могут быть созданы для совместной работы на C++ с использованием библиотеки QtWinMigrate DLL. – cdiggins

0

Одним из решений является создание модуля QtWinMigrate для создания QWinHost, который поддерживает родительский учет для родного HWND, но, к сожалению, он не является частью дистрибутива PyQt.

Здесь можно найти некоторые источники: https://github.com/glennra/PyQtWinMigrate.

Это то, что должно было быть сделано для интеграции Python в 3ds Max by Blur studio. Я в настоящее время studying the C++ source code of QWinWidget тоже вижу, могу ли я разработать альтернативное решение, используя вызовы Win32.