2015-04-24 7 views
1

Я нашел решение, предотвращающее app.exec() от блокировки основной темы here.Как использовать потоки для создания нескольких QApplication

Я пытался осуществить это, но я получил следующие ошибки:

WARNING: QApplication was not created in the main() thread. 
QWidget: Cannot create a QWidget without QApplication 

Вот мой код:

PB является классом, который имеет статическую функцию, которая инициализирует графический интерфейс.

pb.cpp:

bool PB::Init(int argc, char *argv[], 
     int ID) { 

    QApplication app(argc, argv); 
    PB PB(ID); // The constructor creates an instance of the pushbutton qt object 
    app.exec(); 
    return true; // Do I even need this because app.exec() runs an infinite loop right? 

} 

main.cpp:

int main(int argc, char *argv[]) { 

    std::thread first(&PB::Init, argc, argv, 0); 
    std::thread second(&PB::Init, argc, argv, 1); 

    first.join(); 
    second.join(); 

} 

Дело в том, я инициализацию QApplication в классах поэтому он должен работать ... Я убедился, что это было бы работа с отдельным тестом, где QApplication не используется в основном:

int main(int argc, char *argv[]) { 

    PB::Init(argc, argv, 0); 

} 

Этот код работает нормально. Так что только когда я добавляю поток, я получаю эту ошибку.

+2

Почему, по-вашему, вам нужны два QApplications? QEventLoop или QThread :: exec() будут обеспечивать цикл событий, если это вам нужно. –

+0

Не нужно QApplication, чтобы иметь возможность создавать QWidget? Когда я удаляю QApplications, я получаю 'QWidget: должен построить QApplication перед ошибкой QWidget'. –

+0

Извините, но виджеты Qt не поддерживают многозадачность. QWidget должен быть создан в одном (основном) потоке, где находится QApplication. Используйте потоки для расчета данных и передавайте результаты с помощью сигналов Qt :: QueuedConnection в основной поток, который будет отображаться в графическом интерфейсе. Проверьте [threaded mandelbrot example] (http://doc.qt.io/qt-5/qtcore-threads-mandelbrot-example.html) об основном (GUI) и обмениваться потоками рабочего потока. –

ответ

4

Вы можете создать QApplication в другой теме, но вы должны создать все объекты GUI-classe в этом потоке, иначе вы получите неопределенное поведение. QApplication - singleton, поэтому вы не можете создавать несколько экземпляров QApplication в разных потоках.

+0

Один пункт: нет такой вещи, как «основная нить». Вы можете безопасно создать 'QApplication' в« non-main »thead и не будет UB. Но вы правы, что 'QApplication' является singleton. @Justin имеет проблемы, когда он создает второй экземпляр 'QApplication'. Это не зависит от потоков. Пожалуйста, исправьте ответ. –

+0

@SaZ, спасибо, я исправил его. Вы можете редактировать мой английский (= – gomons

+0

Мой английский тоже не очень хороший. Теперь ответ в порядке. –