LINUX.ORG.RU

Переопредели onDraw, вызови код предка, потом свой код выполняй.

Но лучше поподробнее расскажи о проблеме. Судя по всему, у тебя какой-то косяк в архитектуре.

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от dib2

после первого paintEvent

Но как? В конце paintEvent я не могу приписать этот код — он сам впоследствии дёргает перерисовку. Получается рекурсия. Виджету плохеет.

Stahl ★★☆
() автор топика
Ответ на: комментарий от trex6

onDraw

Это чем-то отличается от дописывания своего кода к paintEvent?

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

так guard поставь, чтобы один раз выполнялся.
а вообще - откуда такое условие - «строго ПОСЛЕ отрисовки виджета.»? что заставляет тебя ждать отрисовки?

dib2 ★★★★★
()
Ответ на: комментарий от dib2

Мой код в итоге дёргает repaint(). Несколько раз. Поэтому я не могу разместить его в paintEvent.

что заставляет тебя ждать отрисовки?

Если я начинаю манипуляции ДО отрисовки, то, разумеется, не вижу процесса, а лишь итог. Мне нужно чтобы был виден процесс отрисовки.

Stahl ★★☆
() автор топика
Последнее исправление: Stahl (всего исправлений: 1)
Ответ на: комментарий от Stahl

Мой код в итоге дёргает repaint(). Несколько раз.

чтобы «стопудово отрисовалось»? :3

Поэтому я не могу разместить его в paintEvent.

ну поставь тогда QTimer::singleShot() в него

Если я начинаю манипуляции ДО отрисовки, то, разумеется, не вижу процесса, а лишь итог. Мне нужно чтобы был виден процесс отрисовки.

ты замедляешь процесс с пом. sleep или что?
может тебе нужны анимации?

dib2 ★★★★★
()
Ответ на: комментарий от dib2

может тебе нужны анимации?

Да, это что-то вроде анимаций.
И начинать эту «анимацию» мне нужно после прорисовки виджета какой-то дрянью по умолчанию.

QTimer

Ты предлагаешь запустить свой код через некоторое время после запуска paintEvent? Через какое время? Наобум? Авось заработает?

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Если таймеру выставить ЕМНИП нулевое время он выполнится как только управление будет передано эвентлупу.

KblCb ★★★★★
()

Более того, он вывывается при появлении виджета (например, при вызове show()), а далеко не при каждой перерисоввке

annulen ★★★★★
()
Ответ на: комментарий от trex6

Может. Но я и Qt использую специфически — Qt мне нужен лишь как «платформа», от которой я должен как можно быстрее перейти к нормальному Си++. Qt-специфического кода должно быть как можно меньше.
Ну как ты мне предложишь сделать анимацию на виджете? Причём суть анимации должна управляться сторонним, не имеющим в этому виджету отношения, классом.
Сейчас у меня просто наследник QLabel, который от стороннего класса получает команду «забери следующую порцию данных и рисуй».
Есть более эффективные идеи? Сам QLabel это единственный виджет. Больше ничего нет. Он просто «холст». Содержимое его управляется уже логикой. Этот Label не должен ни прятаться, ничего он не должен делать, кроме как рисовать то, что скажут и тогда, когда скажут. И оптимизировать, буферизировать он тоже ничего не должен.

Stahl ★★☆
() автор топика
Последнее исправление: Stahl (всего исправлений: 1)
Ответ на: комментарий от Stahl

Ну как ты мне предложишь сделать анимацию на виджете?

анимация делается таймерами.

dib2 ★★★★★
()
Ответ на: комментарий от Stahl

Анимацию делаешь через таймеры.

Передачу информации - через сигналы/слоты (заодно получаешь бесплатную потокобезопасность).

Рекомендую посмотреть на готовые классы для анимации, ЕМНИП, их в куте было завезено.

Пейнтэевент тебе не нужен.

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

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

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Ок. Таймеры можно и не в Qt сделать, отгородить интерфейсом работу с сигналами-слотами - не более 1го дня с тестированием.

Городить говноархитектуру - бесценно.

trex6 ★★★★★
()
Ответ на: комментарий от Stahl

я не могу приписать этот код — он сам впоследствии дёргает перерисовку

ну то есть ты понял, что тебе нужно на showEvent установить флажок, а на paintEvent - проверить его, сделать что нужно если он установлен, и сбросить его.

ckotinko ☆☆☆
()
Ответ на: комментарий от Stahl

Но как? В конце paintEvent я не могу приписать этот код — он сам впоследствии дёргает перерисовку. Получается рекурсия. Виджету плохеет.

Кинь кастомное событие в цикл событий — тогда оно выполнится уже после отрисовки. Есть std::once(), чтобы выполнить ровно один раз на программу, ну или свой булевский флаг, чтобы выполнить ровно один раз на виджет.

quiet_readonly ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.