Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: iceBear от Июль 19, 2012, 15:59



Название: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: iceBear от Июль 19, 2012, 15:59
Здравствуйте,

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

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

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

спасибо





Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: iceBear от Июль 19, 2012, 16:01
... хоть  в каком направлении рыть, чтобы избежать таких коллизий?

спасибо


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: mutineer от Июль 19, 2012, 16:05
все эти действия происходят в одном потоке?

Тото я думаю тема знакомая - а это просто дубль, оказывается...
Обновляй текст в главном потоке


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: iceBear от Июль 20, 2012, 07:22
Да, тема та же, но теперь текст обновляется в главном потоке, поэтому вопрос был переформулирован в другом разделе


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: Bepec от Июль 20, 2012, 07:32
Насколько я помню, paint вызывается именно QGraphicsView. Если же вы вызываете его сами - в вашем же коде и проблема.


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: iceBear от Июль 20, 2012, 08:48
paint ()  я пока еще сам не вызывал - только думал об этом, теперь наверное и не буду


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: mutineer от Июль 20, 2012, 11:26
Да, тема та же, но теперь текст обновляется в главном потоке, поэтому вопрос был переформулирован в другом разделе

Если все перерисовки вызываются из главного потока, то одновременно они вызываться не могут


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: iceBear от Июль 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 () между собой не могут подружиться.

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

може пример какой-нибудь существует, стандартные демы заботанил, ничего аналогичного кроме анимации не нашел, но она не подходит.


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: mutineer от Июль 23, 2012, 11:25
sensors живет в главном потоке?
Что такое _text?


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: iceBear от Июль 23, 2012, 11:51
_text экземпляр QGraphicsSimpleTextItem, sensors - вектор, где эти экземпляры храняться, он живет в том же потоке, что и граф. интерфейс,

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


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: _OLEGator_ от Июль 23, 2012, 14:56
Сделай минимальный проект с ошибкой, чтобы каждый смог собрать и посмотреть, а не снабжай нас огрызками кода.


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: iceBear от Июль 23, 2012, 15:11
тебе его куда выложить?


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: Bepec от Июль 23, 2012, 15:16
Сюда. Открой Дополнительные опции при создании сообщения и прикрепи архив.


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: Fregloin от Июль 23, 2012, 16:06
размер текстового буфера не маловат?


Название: Re: изменение содержания QgraphicsSimpletextItem и системный paint ()
Отправлено: mutineer от Июль 23, 2012, 16:10
_text экземпляр QGraphicsSimpleTextItem, sensors - вектор, где эти экземпляры храняться, он живет в том же потоке, что и граф. интерфейс,

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

Ну и откуда у вектора слот?
В общем да, код давай