我现在在做QT的电子点菜系统,遇到个问题,就是我在服务端主函数里面创建了个QWidget对象,用来显示管理界面,然后又创建了一个子线程用来创建套接字并监听接受客户端发送的数据。现在的问题是我想在客户端发送数据过来并且服务端收到数据后在服务端弹出一个消息框提示有客户点菜,结果运行程序并点菜出现“QPixmap: It is not safe to use pixmaps outside the GUI thread”这种提示,并且整个程序卡死。我去查过说是在子线程中不能使用QT的QMessageBox类。求解。。。。
------解决方案--------------------
去看下qt 多线程重入、线程安全
qt 助手
Reentrancy and Thread-Safety
Thread-Support in Qt Modules -> Painting in Threads
QPainter can be used in a thread to paint onto QImage, QPrinter, and QPicture paint devices. Painting onto QPixmaps and QWidgets is not supported.
Any number of threads can paint at any given time, however only one thread at a time can paint on a given paint device. In other words, two threads can paint at the same time if each paints onto separate QImages, but the two threads cannot paint onto the same QImage at the same time.
多线程绘制有限制
或者看书 《C++ GUI Qt 4编程》 第14章 多线程 这章,
------解决方案--------------------
子线程里不能创建和显示qgui的东西
QGUI的类必须和QcoreApplication在一个线程
可以在子线程里调用界面线程的一个方法
然后由该方法emit signal
然后界面线程的slot去处理
------解决方案--------------------
ls说的对 只有主线程操作ui才是安全的 子线程必须emit信号给主线程 或者postevent到消息队列才能更新ui
------解决方案--------------------
归根结底一句话:对UI的操作只能放在UI主线程中,不能在子线程中处理。
------解决方案--------------------
这个只是关联signal与slot,你只有在其他地方调用emit changeText(PEOPLE),才会发出这个信号。
------解决方案--------------------