Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Июнь 22, 2009, 12:31



Название: Перерисовка самодельного нарисованного виджета - не работает.
Отправлено: xintrea от Июнь 22, 2009, 12:31
Здравствуйте!


Я сделал себе виджет, унаследованный от QWidget. Его рисую сам, в paintEvent(). Виджет чем-то похож на QSlider, на нём есть несколько "движков".

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

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

Код:
update();
repaint();
QWidget::update();
QWidget::repaint();
emit update();
emit repaint();

Но на экране ничего не обновляется.

Всё сделано практически  как в примере examples/widgets/analogclock. Только в примере обновление происходит через таймер

Код:
connect(timer, SIGNAL(timeout()), this, SLOT(update()));

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


Подобный вопрос уже возникал в теме "Класс, унаследованный от QTextEdit. Не могу обновить изображение текста" http://www.prog.org.ru/index.php?topic=9810.msg56703#msg56703 (http://www.prog.org.ru/index.php?topic=9810.msg56703#msg56703). Там посоветовали использовать

Код:
viewport()->update()

но в классе QWidget метода viewport() нет. Да и пример AnalogClock замечательно обновляет свой вид без viewport().


Вопрос - что делаю не так?

Заголовок http://paste.org.ru/?xgxis0
Реализация http://paste.org.ru/?kip82q
Вызов обновления происходит в методе mouseMoveEvent().


Название: Re: Перерисовка самодельного нарисованного виджета - не работает.
Отправлено: spectre71 от Июнь 22, 2009, 12:42
QWidget::setMouseTracking(true); Не забыл сделать, если движение мыши без нажатой кнопки.


Название: Re: Перерисовка самодельного нарисованного виджета - не работает.
Отправлено: spectre71 от Июнь 22, 2009, 12:51
Ты посмотри:
 if(current_sel_indent==sel_textindent)textindent_pos=x;
 if(current_sel_indent==sel_leftindent)leftindent_pos=x;
 if(current_sel_indent==sel_rightindent)rightindent_pos=x;
у тебя эти условия срабатывают?


Название: Re: Перерисовка самодельного нарисованного виджета - не работает.
Отправлено: Rcus от Июнь 22, 2009, 12:52
Да это фигня, mouseTracking влияет только на получение событий когда не нажаты клавиши мыши. Настоящая проблема кроется в неправильном использовании ключевого слова static во вспомогательных методах (да, я уже собрал mockup, проверил и все такое). В Analog Clock такое работает, потому что производится поворот painter'а. В представленном случае можно использовать QPainter::translate.


Название: Re: Перерисовка самодельного нарисованного виджета - не работает.
Отправлено: xintrea от Июнь 22, 2009, 12:54
Да это фигня, mouseTracking влияет только на получение событий когда не нажаты клавиши мыши. Настоящая проблема кроется в неправильном использовании ключевого слова static во вспомогательных методах

Ат блин, не увидел. Копипаст из хелпа меня подвел!