如何从QThread启动GUI窗口?

时间:2011-11-25 19:34:57

标签: qt user-interface chat qthread

我正在开发一个聊天程序,其中客户端是单线程的,但服务器将为每个连接的客户端启动一个新线程。我相信我的客户端代码是可靠的,但服务器让我感到困惑。

现在,我有一个派生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 个答案:

答案 0 :(得分:1)

是的,你是以错误的方式解决这个问题。由于平台限制,GUI是单线程系统。您无法在不同的线程上创建,更改和管理GUI对象 - 所有操作都必须在一个线程(通常是GUI线程)上完成。

Qt有两种处理工作线程和GUI的机制:排队信号和插槽,以及QCoreApplication :: postEvent()处理程序。

更多详细信息在综合Qt线程文档中:http://doc.qt.io/qt-5/thread-basics.html