Вызов метода QAxWidget вне потока GUI - PullRequest
0 голосов
/ 14 мая 2010

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

У меня есть приложение 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, чтобы получить желаемые результаты?

Ответы [ 2 ]

3 голосов
/ 18 мая 2010

После некоторых экспериментов я смог решить эту проблему, выполнив что-то, что, как мне казалось, я попробовал ранее: создать новый QThread и вызвать QAxWidget :: dynamicCall из нового потока. Должно быть, я не кодировал его правильно, когда впервые попробовал это решение; посидев с коллегой, мы смогли заставить его работать. Если быть точным, то, что мы сделали, это:

(Шаг 1) Создан подкласс QThread для представления потока, который мне нужен для вызова dynamicCall ().

(Шаг 2) В конструкторе моего QThread передайте указатель на мой оригинальный QAxWidget и сохраните указатель в переменной-члене.

MyThread::MyThread(QAxWidget* passedWidget) : QThread()  
{  
    actualWidget = passedWidget;  
}  

(Шаг 3) В методе run () класса QThread вызовите метод dynamicCall () класса QAxWidget.

void MyThread::run()  
{  
    QVariant result = actualWidget->dynamicCall(...parms as necessary...);  
}  

(Шаг 4) Вернувшись в свой основной код, когда мне нужно выполнить dynamicCall (), я просто вызываю метод start () MyThread. Метод start () выполнит run () в своем собственном потоке, отправив необходимую команду объекту ActiveX, не блокируя и не останавливая основной поток графического интерфейса.

0 голосов
/ 07 октября 2014

Если нет необходимости в цикле событий, то нет необходимости НЕ создавать подкласс QThread! Я думаю, что это способ решить эту проблему без множества сигналов для основного потока, который (более чем вероятно) владеет QAxWidget. Последние документы по Qt 5.3, относящиеся к QThread, также подтверждают это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...