Мне нужен должностному лицу () QApplication в потоке, который не является основным (мои графический интерфейсы пользователя должны быть плагинами, которые могут быть динамично загружены и разгружены во времени выполнения, таким образом, у меня нет доступа к основному потоку). Кто-либо знает о (относительно) безболезненном способе бездельничать ограничение QT против запуска QApplication за пределами основного?
Я разрабатываю в Linux с Qt4 в C++ с помощью gcc4.3.4.
Если вы используете QThread, то у вас уже есть нормальный цикл событий Qt и вы можете просто запустить exec() внутри функции QThread::run(). Хотя вы не можете работать с объектами GUI вне основного потока, вы все еще можете взаимодействовать с ними через очереди сигналов/слотов. Возможно, вы можете попробовать хранить указатель на объект QThread главного потока и вызывать QObject::moveToThread() для перемещения объектов GUI в главный поток вместо перемещения QApplication в другой поток.
Я думаю, что это не очень хорошая идея - пытаться идти против инструментария с различными хаками и глюками.
Хорошо, у меня есть кое-что, что работает! Это некрасиво, но определенно работает.
Создайте производную от QMainWindow со всем вашим фактическим кодом GUI и перегрузите функцию event () этого класса, чтобы вызвать this-> show ()
Создайте класс (назовем его Runner), который будет содержать указатель на вашу производную от QMainWindow и дайте ему функцию запуска.
В Runner :: Runner () запустите поток, который вызовет Runner :: run ()
В Runner :: run () (который теперь выполняется в собственном потоке) создайте QApplication, и экземпляр вашего производного QMainWindow. Вызовите функцию exec () приложения QApplication.
Теперь, когда вы хотите запустить свой графический интерфейс, просто опубликуйте любое событие в производной от QMainWindow, и оно проявит себя!
Похоже, это решение очень хорошо работает в Linux, хотя на самом деле кажется, что оно использует некоторые лазейки в Qt и может не работать на других платформах. Однако определенно проще, чем исправлять Qt.
Патч Qt, я думаю, и удалим проверку основного потока, и протестируем если это сработает для вас. Согласно http://bugreports.qt-project.org/browse/QTBUG-7393 это не будет работают на OS X / Cocoa, поскольку Cocoa предполагает, что первый порожденный поток является основным потоком / потоком пользовательского интерфейса.