Qt4 - Обновление графического интерфейса из другого потока - PullRequest
1 голос
/ 29 сентября 2010

В C # вы можете делать следующее, когда вам нужно обновить графический интерфейс из другого потока:


control.Invoke(delegate()
{

   // Do whatever you want in the gui thread here

});

Есть ли что-то похожее и простое для Qt4?(В частности, PyQt4)
Я бы предпочел не связываться с сигналами, слотами и использовать собственные потоки вместо QThreads, если это возможно.

Какой самый простой способ обновить графический интерфейс Qt4 из не-qt (нативного) потока?

Ответы [ 3 ]

3 голосов
/ 29 сентября 2010

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

В некоторых подклассах QObject, таких как MyObject, вы переопределяете customEvent() навыполните некоторые действия, основанные на одном из ваших пользовательских событий.

Вы можете опубликовать пользовательское событие на MyObject из любого потока, используя QCoreApplication::postEvent().Это потребует от вызывающего абонента знать немного Qt.Чтобы обойти это, я хотел бы написать метод на MyOjbect, который инкапсулирует создание пользовательского события и отправку его себе.

Отправка асинхронна, и выполнение в customEvent() выполняется в потоке графического интерфейса.

Если вам нужно передать данные, подкласс QEvent с установщиками и получателями.

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

0 голосов
/ 29 сентября 2010

Самый простой способ - использовать сигналы и слоты, поскольку в документации qt указано

Хотя QObject является реентерабельным, графический интерфейс классы, особенно QWidget и все его подклассы, не реентерабельные. Oни можно использовать только из основного потока. Как отмечалось ранее, QCoreApplication :: exec () также должен быть вызывается из этой темы.

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

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

0 голосов
/ 29 сентября 2010

Сигналы могут пересекать потоки - вот в чем их основная суть.

В общем случае в Qt поток графического интерфейса - единственный, которому разрешено обновлять графический интерфейс, обычное простейшее решение - графический интерфейс, запускающий таймер иперерисовывает себя, читая любой прогресс из функции или переменной в рабочем потоке.

...