• 5188阅读
  • 2回复

求助 QPixmap: It is not safe to use pixmaps outside the GUI thread [复制链接]

上一主题 下一主题
离线yzj19870824
 

只看楼主 倒序阅读 楼主  发表于: 2012-02-18
现有一个线程ReadThread,功能是读取xml文件,将其内容显示在QTreeWidget上。因此需要给它的构造函数传递一个QTreeWidget的引用。
执行时出现了“QPixmap: It is not safe to use pixmaps outside the GUI thread”的问题。这是不是因为该子线程出现了与界面相关代码的缘故? 简约代码如下,还请问如何解决。

void MainWindow::start(){
    // 提取一条记录显示在tw中
    ReadThread oReader(ui->twServerMonitor);
    oReader.start();

    oReader.wait();
}
其run函数为:
void ReadThread::run(){

    forever{
        sleep(2);

        mutex.lock();

        if(!QFile::exists(file.fileName())){

            mutex.unlock();
        }else{
           // 将file指定的文件内容用widget显示出来
            YzjReader oReader(widget);
            oReader.ReadYzj(&file);

            mutex.unlock();
        }
    }
}
离线yzj19870824

只看该作者 1楼 发表于: 2012-02-19
补充上文:
MainWindow::start()函数中的ui->twServerMonitor最终要传递给ReadThread::run()中YzjReader oReader(widget) 的widget. 有没有大侠解救一下
离线yzj19870824

只看该作者 2楼 发表于: 2012-02-21
"Qt只允许主线程使用界面类,因为界面类不是线程安全的,不可重入,在多个线程中使用可能会出现问题,因此Qt不建议主界面线程外的线程使用图形类和调用图形类接口。建议你修改最初的设计,让界面与控制分离,主线程主要做界面显示,次线程使用signal-slot控制主线程中的界面类,从而间接达到控制目的,connect时指定slot在主线程中运行"

的确是这样的原因。
我的解决方法是将原来线程中需要界面控件传值的代码,放到主界面类的槽函数中,而原来线程的run函数,就发射一个信号。 并在住界面类的构造函数中写connect(&thread, SIGNAL(XXX), this, SLOT(YYY));
快速回复
限100 字节
 
上一个 下一个