Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: pethead от Октябрь 27, 2010, 12:50



Название: [solved]QGraphicsItem update from thread
Отправлено: pethead от Октябрь 27, 2010, 12:50
subj

пытаюсь прикрутить к QGraphicsItem поток чтобы тот вызывал по нужде перерисовку QGraphicsItem, но судя по всему из потока доступ к QGraphicsItem не выйдет. говорят надо как то прикрутить посыл сигнала из потока в главный поток приложения и там уже вызывать отрисовку.

но что то не работает посыл сигнала:
QGraphicsItem m_Chip
MainWindow widget;

код потока

void Thread::run()
{
   while (!m_stopped) {
      QColor cc;
      cc.setRgb(qrand()/(double)RAND_MAX*256,qrand()/(double)RAND_MAX*256,qrand()/(double)RAND_MAX*256,127);

      m_Chip->color=cc;

      emit itemRepaint(m_Chip);
      QTest::qSleep(200);
    }
    m_stopped = false;
}

перед запуском потока

QObject::connect(&threadA,SIGNAL(itemRepaint(Chip)),widget,SLOT(updateItem(Chip)));

в классе потока

signals:
   void itemRepaint(Chip* chip);

в MainWindow

public slots:
   void updateItem(Chip *item);

void MainWindow::updateItem(Chip *item)
{
//сюда не попадает
   item->update(item->boundingRect());
}

**
сделал демку с мультипоточностью и отрсиовкой Qgrapicsitem из потоков с передачей сигналов о перерисовке.
кому интересно приложено.


Название: Re: QGraphicsItem update from thread
Отправлено: Пантер от Октябрь 27, 2010, 13:00
Что в консоль сыпется?

widget  - MainWindow *widget - так?


Название: Re: QGraphicsItem update from thread
Отправлено: AlekseyK от Октябрь 27, 2010, 13:13
Покажи объявление itemRepaint и updateItem? И потом нужно вызывать:
Код
C++ (Qt)
QObject::connect(&threadA,SIGNAL(itemRepaint(Chip)),widget,SLOT(updateItem(Chip)), Qt::QueuedConnection);

Посмотри примеры examples\threads\mandelbrot\ и examples\network\blockingfortuneclient\ и поймёшь как передавать данные из потока и почему у тебя не передаётся.


Название: Re: QGraphicsItem update from thread
Отправлено: pethead от Октябрь 27, 2010, 14:23
дописал Qt::QueuedConnection

но работает как то через раз, от компиляции к компиляции. ниче не понимаю...
и работает если посылать сигнал с текстом
emit Signal_AppendTextThreadB("from B");
а сигнал с указателем не приходит
emit Signal_itemRepaint(m_Chip);

нашел проблему и с указателем.
надо писать так:
   QObject::connect(&thread,SIGNAL(Signal_itemRepaint(Chip*)),
      widget,SLOT(Slot_itemRepaint(Chip*)),Qt::QueuedConnection);


а я писал
   QObject::connect(&thread,SIGNAL(Signal_itemRepaint(Chip)),
      widget,SLOT(Slot_itemRepaint(Chip)),Qt::QueuedConnection);

балбес...


Название: Re: [solved]QGraphicsItem update from thread
Отправлено: AlekseyK от Октябрь 27, 2010, 16:06
Я думаю, что ты правильно сигналы вызывал, только в параметрах itemRepaint и updateItem нужно было указать: (const Chip &).