создание QApplication в другом потоке

Я пытаюсь создать QApplication в другом потоке, но обнаружил 2 основные проблемы:
1- Я не могу взаимодействовать с GUI
2- некоторые предупреждения:
WARNING: QApplication was not created in the main() thread.
QObject::startTimer: timers cannot be started from another thread //happens when resizing widget
QObject::killTimer: timers cannot be stopped from another thread

вот полный код: (он может иметь некоторые утечки памяти, но в целях тестирования он терпит неудачу)

//main.cpp

#include <QCoreApplication>
#include "cthread.h"
int main(int argc, char *argv[])
{
CThread *MyThread = new CThread;
MyThread->start();

QCoreApplication a(argc, argv);

return a.exec();
}

//CThread.h

#ifndef CTHREAD_H
#define CTHREAD_H

#include <QThread>
#include "theqtworld.h"
class CThread : public QThread
{
Q_OBJECT
public:
CThread();
void run( void );

private:
TheQtWorld *mWorld;
};

#endif // CTHREAD_H

//CThread.cpp

#include "cthread.h"#include <iostream>

CThread::CThread():mWorld(NULL)
{
}void CThread::run()
{
std::cout << "thread started" << std::endl;
if(!mWorld)
mWorld = new TheQtWorld();

mWorld->OpenWorld();//now it will init all Qt Stuff inside

//    if(mWorld) delete mWorld;
//    emit this->exit();
}

//theqtworld.h

#ifndef THEQTWORLD_H
#define THEQTWORLD_H

#include <QObject>
#include "mainwindow.h"#include <QApplication>

class TheQtWorld : public QObject
{
Q_OBJECT
public:
explicit TheQtWorld(QObject *parent = 0);
int OpenWorld(void);

signals:

public slots:

};

#endif // THEQTWORLD_H

//theqtworld.cpp

#include "theqtworld.h"
TheQtWorld::TheQtWorld(QObject *parent) :
QObject(parent)
{
}

int TheQtWorld::OpenWorld()
{
static int arg = 0;
static char *b[2];
b[0] = "a";

QApplication *a = new QApplication(arg, b);
a->setParent(this);

MainWindow w;
w.show();

return a->exec();
}

2

Решение

Я бы ответил на свой вопрос после понимания, как преодолеть эту проблему

Сначала проблема заключалась в том, чтобы интегрировать Qt GUI как плагин в другое приложение, поэтому основной проблемой было столкновение цикла Event между Qt Events и любыми другими событиями приложения.

Моими первыми мыслями было разделить оба, поэтому QApplication останется в другом потоке, но это был совершенно неправильный подход, и вот что я заметил:

1- Qt GUI должен оставаться в главном потоке () so there is no other place for QApplication
2- чтобы избежать блокировки QApplication::exec() вставлять QApplication::processEvents() в другой цикл Application Event

вот рабочий код:

//main.cpp

#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication mApp(argc, argv);
MainWindow w;
w.show();

//just for testing and holding the program so it doesn't end
for(int i = 0; i < 100000000; ++i)
{
mApp.processEvents();
}
return 0;
}

Отредактируйте: спасибо Павлу-Страхову за его замечательное предложение.

1

Другие решения


По вопросам рекламы [email protected]