Я начинаю задумываться о том, возможно ли это, но я подумал, что могу спросить, если есть разумный способ обойти проблемы, с которыми я сталкиваюсь.
У меня есть приложение Qt, использующее элемент управления ActiveX. Элемент управления удерживается QAxWidget, а сам QAxWidget содержится в другом QWidget (мне нужно было добавить дополнительные сигналы / слоты в виджет, и я не мог просто создать подкласс QAxWidget, потому что класс этого не позволяет). Когда мне нужно взаимодействовать с элементом управления ActiveX, я вызываю метод QWidget, который, в свою очередь, вызывает метод dynamicCall QAxWidget, чтобы вызвать соответствующий метод элемента управления ActiveX. Все это работает нормально.
Однако для возврата из одного метода элемента управления ActiveX требуется несколько секунд. Когда я вызываю этот метод, весь мой графический интерфейс блокируется на несколько секунд, пока метод не вернется. Это нежелательно. Я бы хотел, чтобы элемент управления ActiveX отключился и выполнил свою обработку самостоятельно и вернулся ко мне, когда это будет сделано без блокировки графического интерфейса Qt.
Я попробовал несколько вещей без успеха:
- Создание нового QThread и вызов QAxWidget :: dynamicCall из нового потока
- Подсоединение сигнала к соответствующему методу слота QAxWidget и вызов метода с использованием сигналов / слотов вместо динамического вызова
- Вызов QAxWidget :: dynamicCall с использованием QtConcurrent :: run
Ничто, кажется, не влияет на поведение. Независимо от того, как и где я использую dynamicCall (или запускаю соответствующий слот QAxWidget), графический интерфейс блокируется, пока элемент управления ActiveX не завершит свою работу.
Есть ли способ отсоединить эту обработку ActiveX от потока графического интерфейса Qt, чтобы графический интерфейс не блокировался, пока элемент управления ActiveX выполняет метод? Есть ли что-нибудь умное, что я могу сделать с QAxBase или QAxObject, чтобы получить желаемые результаты?