Как я могу запустить окно графического интерфейса из QThread? - PullRequest
0 голосов
/ 25 ноября 2011

Я работаю над программой чата, в которой клиент является однопоточным, но сервер запускает новый поток для каждого подключенного клиента. Я считаю, что мой клиентский код надежен, но сервер сбил меня с толку.

Прямо сейчас у меня есть производный класс QTcpSocket, который ищет входящие соединения и, когда он видит одно, начинает новый QThread. Когда QThread запускается, он создает экземпляр QMainWindow (который является окном чата) и показывает его.

void secureserver::incomingConnection(int socketDescriptor)
{
    securethread *thread = new securethread(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}

void securethread::run()
{
    serverwindow myServerWindow;
    myServerWindow.setSocketDescriptor(mySocket);
    myServerWindow.show();
}

Я получаю ошибки в stderror, как показано ниже, и QMainWindow никогда не появляется, поэтому общение невозможно на этом этапе.

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QApplication(0xbf9e5358), parent's thread is QThread(0x98a54f0), current thread is securethread(0x99e9250)
QPixmap: It is not safe to use pixmaps outside the GUI thread

Мои вопросы:

  • Нужно ли сделать QThread родителем QMainWindow?
  • Я поступаю совершенно неправильно?
  • Любые другие общие идеи о том, почему это не работает, как я ожидаю или как это исправить было бы очень полезно.

1 Ответ

1 голос
/ 25 ноября 2011

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

Qt имеет два механизма для работы с рабочими потоками и GUI: помещенные в очередь сигналы и слоты, а также обработчик QCoreApplication :: postEvent ().

Более подробная информация содержится во всеобъемлющем документе о потоках Qt: http://doc.qt.io/qt-5/thread-basics.html

...