Функция обратного вызова в Qt UI из не-пользовательских классов - PullRequest
1 голос
/ 09 ноября 2010

Я использую стороннюю библиотеку, из которой я хочу сделать обратный вызов пользовательского интерфейса (написанный на qt) при некоторых событиях. Я регистрирую обратный вызов с помощью указателя функции интерфейса, но когда я получаю обратный вызов, я получаю следующую ошибку «QObject :: startTimer: QTimer можно использовать только с потоками, запущенными с QThread» и «QPixmap: небезопасно использовать растровые изображения вне потока GUI» и ошибка сегментации.

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

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

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Решение состоит из трех частей:

  • Используйте QThread для создания экземпляра вашего рабочего потока.
  • Используйте QImage вместо QPixmap.QPixmaps хранятся в графической подсистеме и, следовательно, управляются основным потоком (GUI).QImages хранятся в памяти и могут удерживаться любым потоком.
  • Используйте концепцию сигнал / слот.Допустимо отправлять сигнал из других потоков, кроме основного потока.

Только если вы хотите также получать сигналы внутри вашего рабочего потока, например, обратную связь от ввода пользователя (например, кнопку «отмена»)вам также нужен цикл событий QT в вашем рабочем потоке.Ваш QTimer не будет работать, если он будет запускать слот в рабочем потоке без цикла событий.

Read http://doc.trolltech.com/4.5/threads.html

0 голосов
/ 09 ноября 2010

Ну, похоже, вам нужны две вещи:

  1. Настройка класса QObject без GUI с сигналами и слотами для обратных вызовов.
  2. Убедитесь, что этот класс и / или его функции вызываются / создаются из основного потока графического интерфейса программы, возможно, как (указатель) член данных, который существует до тех пор, пока программа выполняется.

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

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