QImage в QPixmap через другой поток

У меня проблема с отправкой QImage в GUI-поток:

это мой код в дочернем потоке:

QSize size = ui->label_2->size();
size=ui->label_2->size();
QImage pic(size.width(),size.height(),QImage::Format_ARGB32_Premultiplied);
pic.fill(Qt::transparent);
QPainter painter(&pic);
for (unsigned int i=0; i < wayVector.size(); i++){
    double *x = new double[wayVector[i].refs.size()];
    double *y = new double[wayVector[i].refs.size()];
    for (unsigned int j=0; j<wayVector[i].refs.size(); j++){
        x[j]=nodeHash[wayVector[i].refs[j]].lon;
        y[j]=nodeHash[wayVector[i].refs[j]].lat;
    }
    for (unsigned int j=0; j<wayVector[i].refs.size()-1;j++){
        painter.setPen(Qt::green);
        painter.drawLine(size.width()*x[j]/(maxlon-minlon),
                         size.height()*maxlat/(maxlat-minlat)-size.height()*y[j]/(maxlat-minlat),
                         size.width()*x[j+1]/(maxlon-minlon),
                         size.height()*maxlat/(maxlat-minlat)-size.height()*y[j+1]/(maxlat-minlat));
    }
}
emit sendPixmap(pic);

Это соединение сигнал/слот:

 connect(this,SIGNAL(sendPixmap(QImage)),this,SLOT(setImage(QImage)));

И это определение слота:

void MainWindow::setImage(QImage img){
    ui->label_2->setPixmap(QPixmap::fromImage(img));
}

Но ничего не произошло, метка стирается, а изображение не появляется. Что я делаю неправильно? Жду вашей помощи :(


person tema    schedule 03.05.2013    source источник
comment
Попробуйте сначала запустить свой код в основном потоке. Кроме того, я не уверен, что вам разрешено использовать QPainter в потоке без графического интерфейса. Попробуйте отправить свое изображение, прежде чем изменить его.   -  person Amartel    schedule 03.05.2013
comment
@Amartel, но wayVector и nodeHash существуют в стеке другого потока, как мне отправить их в основной? Использование слота/сигнала?   -  person tema    schedule 03.05.2013
comment
Да, вы можете использовать сигнал/слот для этого.   -  person Amartel    schedule 03.05.2013
comment
Попробуйте использовать Qt::QueuedConnection в качестве типа соединения в вызове соединения для отправки между потоками.   -  person TheDarkKnight    schedule 03.05.2013
comment
В целом подход должен работать. Однако соединение выглядит неправильно, отправитель и получатель - это оба. Чтобы это работало, QObject-отправитель должен находиться во вторичном потоке, создавая изображение, а получатель — в потоке пользовательского интерфейса (основном).   -  person Frank Osterfeld    schedule 03.05.2013


Ответы (1)


Из документации:

При использовании QPainter для QImage рисование может быть выполнено в другом потоке, отличном от текущего потока GUI.

Итак, то, что вы намереваетесь сделать, должно сработать. Вы уверены, что правильно настроили тему? Ваше использование ui->label_2 выглядит очень подозрительно, у вас есть элементы пользовательского интерфейса в вашем потоке или вы получаете доступ к элементам графического интерфейса из своего потока? Возможно, вам следует показать нам больше вашего кода.

person hmuelner    schedule 03.05.2013