Отрисовка от экрана виджета в отдельной теме Qt

0

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

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

Есть ли способ запустить QApplication в отдельном потоке и связаться с ним, чтобы поток отображения не застревал? Или есть хотя бы способ сделать то, что я хочу делать с Qt?

Большое спасибо !

Редактировать: это приложение в конечном итоге будет Qt Embedded Application

Обновление В основном, мой вопрос: как запустить QApplication в отдельном потоке из моего кода C и связаться с ним?

Теги:
multithreading
qt
qt4

2 ответа

1
Лучший ответ

Я закончил создание отдельного потока для основного цикла событий QApplication (exec()) и использовал сокеты 0mq для связи с ним из остальной части моего приложения.

0

Я не понимаю, что вы подразумеваете под "нарисовать виджет". Но имейте в виду: QWidget является частью GUI, а части GUI должны быть затронуты только потоком Main (UI). Это правило, которое вы не можете изменить. Кроме того, QApplication работает в основном потоке только с тех пор, как QApplication является основной частью самого GUI. Вы можете отправлять сообщения в QAppplication, используя глобальный объект qApp (для этого вам необходимо включить QApplication) и sendEvent() или postEvent().

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

  • 0
    Спасибо за ответ! Рисовать виджет означает ... хорошо рисовать его: мне нужно визуализировать виджет из событий, которые я получаю из других потоков Си. Для меня идеальным вариантом было бы легко обмениваться данными между кодом C и приложением Qt, при этом QApp запускался сам по себе, но, похоже, совсем не существует простого способа сделать это: /
  • 0
    Вы можете иметь специальную ветку для C сообщений. Внутри потока у вас будет некоторый потомок QObject, который будет использовать механизм сигнала \ слота для уведомления определенного виджета о поступлении новых данных. И вы будете рисовать все, что вам нужно в самом виджете. Это действительно совсем не сложно.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню