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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: изменение содержания QgraphicsSimpletextItem и системный paint ()  (Прочитано 6343 раз)
iceBear
Гость
« : Июль 19, 2012, 15:59 »

Здравствуйте,

на главном виджете (ImageViewer) присутствуют еще 10 экземпляров QGraphicsSimpleTextItem, содержимое экземпляров текста периодически обновляется (по событию от таймера, например). При этом операции изменения размеров главного окна, его перетаскивания по экрану приводят ошибке. Чем таймаут таймера, который обновляет текст  больше, тем меньше вероятность возникновения ошибки.

Проблема в том, что в любом случае вероятность сохраняется. Такое чувство, что экземпляры текста постоянно вызывают paint (), и при управлении окном тоже вызывается paint () когда они вызываются одновременно возникает ошибка.

Можно ли как - нибудь в QT управлять вызовом системной paint (), которая проходит из недр библиотеки?

спасибо



Записан
iceBear
Гость
« Ответ #1 : Июль 19, 2012, 16:01 »

... хоть  в каком направлении рыть, чтобы избежать таких коллизий?

спасибо
Записан
mutineer
Гость
« Ответ #2 : Июль 19, 2012, 16:05 »

все эти действия происходят в одном потоке?

Тото я думаю тема знакомая - а это просто дубль, оказывается...
Обновляй текст в главном потоке
« Последнее редактирование: Июль 19, 2012, 16:12 от mutineer » Записан
iceBear
Гость
« Ответ #3 : Июль 20, 2012, 07:22 »

Да, тема та же, но теперь текст обновляется в главном потоке, поэтому вопрос был переформулирован в другом разделе
Записан
Bepec
Гость
« Ответ #4 : Июль 20, 2012, 07:32 »

Насколько я помню, paint вызывается именно QGraphicsView. Если же вы вызываете его сами - в вашем же коде и проблема.
Записан
iceBear
Гость
« Ответ #5 : Июль 20, 2012, 08:48 »

paint ()  я пока еще сам не вызывал - только думал об этом, теперь наверное и не буду
Записан
mutineer
Гость
« Ответ #6 : Июль 20, 2012, 11:26 »

Да, тема та же, но теперь текст обновляется в главном потоке, поэтому вопрос был переформулирован в другом разделе

Если все перерисовки вызываются из главного потока, то одновременно они вызываться не могут
Записан
iceBear
Гость
« Ответ #7 : Июль 23, 2012, 11:19 »

Здравствуйте,

долго испытывал разные варианты ( не будем их тут перечислять) - решения не придумал и ошибку не нашел - экстракт проблемы такой :

Здравствуйте,

Я добавляю на на qgraphicsscene 10 экземпляров QGraphicsSimpleItemText

QGraphicsScene * scene = new QGraphicsScene;
for ( int i = 0; i < 10; i ++ )
    scene -> addItem (new QGraphicsSimpleItemText ());


далее по сигналу таймера обновляю содержимое этих 10 экземпляров:

QTimer * timer = new QTimer ();
    QObject :: connect (timer, SIGNAL (timeout ()),
        & sensors,
        SLOT (updateScene ())
        );

void OwenSensor :: updateScene ()
    {
    char buf [32];
    sprintf (buf, "%5.2f", _data);
   
    _text -> setText (buf);
    }

через некоторое время программа сваливается в ошибку. Эту ситуацию может ускорить и гарантирует параллельное изменение размеров главного окна. Также появление ошибки ускоряет уменьшение значения таймаута таймера

Такое ощущение, что вызов setText провоцирует вызов метода paint () , а при изменении размеров или положения окна он вызывается автоматически, таким образом два paint () между собой не могут подружиться.

Скажите пожалуйста, что я делаю не так?

може пример какой-нибудь существует, стандартные демы заботанил, ничего аналогичного кроме анимации не нашел, но она не подходит.
Записан
mutineer
Гость
« Ответ #8 : Июль 23, 2012, 11:25 »

sensors живет в главном потоке?
Что такое _text?
Записан
iceBear
Гость
« Ответ #9 : Июль 23, 2012, 11:51 »

_text экземпляр QGraphicsSimpleTextItem, sensors - вектор, где эти экземпляры храняться, он живет в том же потоке, что и граф. интерфейс,

_data  - тип float, числа, которые должны отображаться на сцене
Записан
_OLEGator_
Гость
« Ответ #10 : Июль 23, 2012, 14:56 »

Сделай минимальный проект с ошибкой, чтобы каждый смог собрать и посмотреть, а не снабжай нас огрызками кода.
Записан
iceBear
Гость
« Ответ #11 : Июль 23, 2012, 15:11 »

тебе его куда выложить?
Записан
Bepec
Гость
« Ответ #12 : Июль 23, 2012, 15:16 »

Сюда. Открой Дополнительные опции при создании сообщения и прикрепи архив.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #13 : Июль 23, 2012, 16:06 »

размер текстового буфера не маловат?
Записан
mutineer
Гость
« Ответ #14 : Июль 23, 2012, 16:10 »

_text экземпляр QGraphicsSimpleTextItem, sensors - вектор, где эти экземпляры храняться, он живет в том же потоке, что и граф. интерфейс,

_data  - тип float, числа, которые должны отображаться на сцене

Ну и откуда у вектора слот?
В общем да, код давай
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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