Russian Qt Forum
Май 02, 2024, 11:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [solved]QGraphicsItem update from thread  (Прочитано 4498 раз)
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 из потоков с передачей сигналов о перерисовке.
кому интересно приложено.
« Последнее редактирование: Октябрь 27, 2010, 15:49 от pethead » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 27, 2010, 13:00 »

Что в консоль сыпется?

widget  - MainWindow *widget - так?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
AlekseyK
Гость
« Ответ #2 : Октябрь 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\ и поймёшь как передавать данные из потока и почему у тебя не передаётся.
Записан
pethead
Гость
« Ответ #3 : Октябрь 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);

балбес...
« Последнее редактирование: Октябрь 27, 2010, 16:00 от pethead » Записан
AlekseyK
Гость
« Ответ #4 : Октябрь 27, 2010, 16:06 »

Я думаю, что ты правильно сигналы вызывал, только в параметрах itemRepaint и updateItem нужно было указать: (const Chip &).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.162 секунд. Запросов: 22.