QApplication в неосновном потоке

Мне нужен должностному лицу () QApplication в потоке, который не является основным (мои графический интерфейсы пользователя должны быть плагинами, которые могут быть динамично загружены и разгружены во времени выполнения, таким образом, у меня нет доступа к основному потоку). Кто-либо знает о (относительно) безболезненном способе бездельничать ограничение QT против запуска QApplication за пределами основного?

Я разрабатываю в Linux с Qt4 в C++ с помощью gcc4.3.4.

10
задан rcv 9 May 2010 в 19:25
поделиться

3 ответа

Если вы используете QThread, то у вас уже есть нормальный цикл событий Qt и вы можете просто запустить exec() внутри функции QThread::run(). Хотя вы не можете работать с объектами GUI вне основного потока, вы все еще можете взаимодействовать с ними через очереди сигналов/слотов. Возможно, вы можете попробовать хранить указатель на объект QThread главного потока и вызывать QObject::moveToThread() для перемещения объектов GUI в главный поток вместо перемещения QApplication в другой поток.

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

4
ответ дан 3 December 2019 в 20:40
поделиться

Хорошо, у меня есть кое-что, что работает! Это некрасиво, но определенно работает.

  1. Создайте производную от QMainWindow со всем вашим фактическим кодом GUI и перегрузите функцию event () этого класса, чтобы вызвать this-> show ()

  2. Создайте класс (назовем его Runner), который будет содержать указатель на вашу производную от QMainWindow и дайте ему функцию запуска.

  3. В Runner :: Runner () запустите поток, который вызовет Runner :: run ()

  4. В Runner :: run () (который теперь выполняется в собственном потоке) создайте QApplication, и экземпляр вашего производного QMainWindow. Вызовите функцию exec () приложения QApplication.

  5. Теперь, когда вы хотите запустить свой графический интерфейс, просто опубликуйте любое событие в производной от QMainWindow, и оно проявит себя!

Похоже, это решение очень хорошо работает в Linux, хотя на самом деле кажется, что оно использует некоторые лазейки в Qt и может не работать на других платформах. Однако определенно проще, чем исправлять Qt.

2
ответ дан 3 December 2019 в 20:40
поделиться

Патч Qt, я думаю, и удалим проверку основного потока, и протестируем если это сработает для вас. Согласно http://bugreports.qt-project.org/browse/QTBUG-7393 это не будет работают на OS X / Cocoa, поскольку Cocoa предполагает, что первый порожденный поток является основным потоком / потоком пользовательского интерфейса.

2
ответ дан 3 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: