调用qwidget :: repaint()时崩溃

时间:2012-01-27 14:49:40

标签: c++ qt

我们正在尝试编写一个简单的信使,并遇到了问题。 当我们从另一个线程调用repaint时,我们的程序崩溃了。 这是我们代码的一部分

`

//client.cpp
#include "main_window.h"
extern main_window * m_parent; //m_parent in main_window constructor get assigned with this
std::list<std::string> m_online_contacts;

void client::contacts(std::string str)
{
    m_online_contacts.clear();
    std::string user_n = "";
    size_t j = 0;
    size_t size = str.size();
    j = str.find(':');
    if (size > 2){
        str = str.substr(j + 1);
        j = str.find(':');
        while(j != std::string::npos){
            user_n = str.substr(0, j);
            m_online_contacts.push_back(user_n);
            str = str.substr(j + 1);
            j = str.find(':');
        }
        m_online_contacts.push_back(str);
    }
   if(m_parent)
        m_parent->create_contacts(m_online_contacts);
}



//main_window.cpp

void main_window::create_contacts(std::list< std::string> l)
{
    for(int j = 0; j < m_count; ++j){ //m_count is a count of on-line users
        if(m_users[j]) { //m_users[] is a list of users to be shown
            delete m_users[j];
        }
    }
    if(m_users) {
        delete [] m_users;   
    } 
    m_count = 0;
    std::list <std::string> :: iterator it = l.begin();
    if(l.size() == 0) {
        m_users = new m_label* [1];
        m_users[0] = new m_label(QString::fromStdString("No online contacts"));
    m_layout->addWidget(m_users[0]);
        m_count = 1;
    }
    else {
        m_users = new m_label * [l.size()];
        for (int i = 0; it != l.end(); ++it) {
            m_users[i] = new m_label (QString::fromStdString(*it));
            m_layout->addWidget(m_users[i++]);
            ++m_count;
        }
    }
    this->repaint();
}

` client.cpp和main_window.cpp是不同的文件,可以在不同的线程中工作

这是一个崩溃消息

QObject::setParent: Cannot set parent, new parent is in a different thread
QObject::setParent: Cannot set parent, new parent is in a different thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
QPixmap: It is not safe to use pixmaps outside the GUI thread
Segmentation fault

1 个答案:

答案 0 :(得分:0)

我不是qt专家,但看起来qt不希望你在GUI线程之外搞乱窗口事物(重新绘制)。这对我来说似乎是合理的,因为否则窗口代码中必须有大量的锁才能使其安全地工作。主GUI界面不应该自己重新绘制吗?