Я нашел решение, предотвращающее 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);
}
Этот код работает нормально. Так что только когда я добавляю поток, я получаю эту ошибку.
Почему, по-вашему, вам нужны два QApplications? QEventLoop или QThread :: exec() будут обеспечивать цикл событий, если это вам нужно. –
Не нужно QApplication, чтобы иметь возможность создавать QWidget? Когда я удаляю QApplications, я получаю 'QWidget: должен построить QApplication перед ошибкой QWidget'. –
Извините, но виджеты Qt не поддерживают многозадачность. QWidget должен быть создан в одном (основном) потоке, где находится QApplication. Используйте потоки для расчета данных и передавайте результаты с помощью сигналов Qt :: QueuedConnection в основной поток, который будет отображаться в графическом интерфейсе. Проверьте [threaded mandelbrot example] (http://doc.qt.io/qt-5/qtcore-threads-mandelbrot-example.html) об основном (GUI) и обмениваться потоками рабочего потока. –