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

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

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: Портирование рисования  (Прочитано 26048 раз)
Bepec
Гость
« Ответ #45 : Декабрь 25, 2013, 17:52 »

https://drive.google.com/file/d/0B_mrvcleB88yZTVJMU9oLTlNYjg/edit?usp=sharing
С фильтрами мудрить не стал, нет времени на отладку, но мысль ясна я думаю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #46 : Декабрь 26, 2013, 13:37 »

https://drive.google.com/file/d/0B_mrvcleB88yZTVJMU9oLTlNYjg/edit?usp=sharing
С фильтрами мудрить не стал, нет времени на отладку, но мысль ясна я думаю.
Занялись само-плагиатом, "накрытие виджета стеклом" - а еще есть емкий и хороший термин "layer". В этом нет ничего плохого, но в данном случае это явно не к месту. Создав виджет "сверху" Вы получили массу забот

- нужно следить чтобы он пропускал события через себя
- нужно следить чтобы он был все время самым верхним и покрывал все (напр при resize)
- нужно его зачищать а когда?
и.т.д.

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

Мое мнение - в данном случае надо подходить более принципиально/идейно. Рисование double-buffered, (пусть в одном случае средствами ОС, в др средствами Qt) - значит и надо рисовать прямо в буфере, если такая необходимость возникла. И неважно что там в букваре пишут. А пытаться решить это еще одним (triple) буфером - безыдейно и обречено на "ловлю блох" ("костыль" в молодежных терминах)

Ну ничего, ответили кодом - уже молодец  Улыбающийся
Записан
Bepec
Гость
« Ответ #47 : Декабрь 26, 2013, 14:09 »

Кхм...
Цитировать
в данном случае это явно не к месту
1) Рисование "поверх" подразумевает наличие нескольких слоёв для контроля, собственно, рисования. Думаю вы лучше меня это знаете.

Цитировать
- нужно следить чтобы он пропускал события через себя
2) Достаточно модифицировать пример из Шлее или Бланшета (не помню точно у кого) для пропуска сообщений. Этот функционал я не сделал, ибо его нужно отлаживать, а времени не особо было.

Цитировать
- нужно следить чтобы он был все время самым верхним и покрывал все (напр при resize)
3)Как ни странно, следить "чтоб он был самым верхним" очень легко и просто - мы же следим за пропуском событий. Так что п.2 включает в себя п.3.

Цитировать
- нужно его зачищать а когда?
4) Зачищать когда хотите. Ибо вы получаете полную власть над слоем. Что угодно, хоть чёртиков рисуйте, хоть ангелов стирайте.

Цитировать
напр инвертировать участок окна Вы не сможете.
5) Могу. У меня есть картинка родителя. И у меня есть холст для рисования поверх. Далее уже дело техники.
Получить картинку, инвертировать цвета и нарисовать поверх - спокойно. Придётся часто обновлять в зависимости от области. Но это будет уже затратно и стоит задуматься "а оно нам надо?" ©.
В общем реализуемо, но малополезно.


Цитировать
более принципиально/идейно.
6) Предложите свой вариант вашего кода, который не будет зависеть от "ой окно скрылось и всё исчезло" или "перекрыло окном".


Цитировать
И по той же цитате.
7) Мы хотим рисовать под виджетом (сам виджет), на виджете (контролы) и над виджетом (поверхность). По здравому смыслу надо всё разделять, что мы и делаем, как благоразумные программисты.
3 сущности, как вы правильно и заметили. Мы же не дикари всё пихать в одну котомку.

Задача выполнена? Да. (возразите?)
Затратно? Нет.
Получили ещё один класс? Ради этого тема и была создана. Та малая толика, что он съест компенсируется выполнением задачи.

Само-плагиат? Ничего подобного. К тому же это один из рекомендованных разработчиками Qt способов рисования поверх виджета. Ссылку не приведу за давностью времени, но данная тема обсуждалась ещё на Qt 4.6+ на англицком языке. Тогда у меня руки не дошли попробовать.

Там предлагался ещё способ, я к сожалению не помню какой. Других способов "контролируемого" рисования поверх виджета пока нет.

PS кстати идейный подход вас не смущает смешиванием сущностей?

PPS ваш способ кстати использует хедеры Qt 5.* . Так что я пока не видел примера работающего кода.
« Последнее редактирование: Декабрь 26, 2013, 14:15 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Декабрь 26, 2013, 20:17 »

6) Предложите свой вариант вашего кода, который не будет зависеть от "ой окно скрылось и всё исчезло" или "перекрыло окном".
Пример как это работает
Код
C++ (Qt)
OldPainter painter(window);
Rect R = GetControlRect(comboBox);
for (int i = 0; i < 100; ++i) {
DoSomething(i);
painter.FillRect(&R, i);
}
Inval(&R);
 
Операция идет, прогресс виден - комбик последовательно заливается каким-то цветом. Сам комбик об этом без понятия - это может быть любой др контрол - или область окна. Хорошо, прилетело какое-то чужое окно, а потом скрылось - ну так на след итерации буфер окна опять отфлашится в видео, все норм. Вот все 100 итерации завершены, ушли на цикл событий, а там уже ждет paint который просто отрисует комбик - без всякой заливки которая уже не нужна.
Записан
Bepec
Гость
« Ответ #49 : Декабрь 26, 2013, 20:21 »

Ваш пример будет работать только при итеративной отрисовке с быстрыми "тиками", я так понимаю. В принципе тоже удобно, но только очень специфично.

В любом случае спасибо за "толчок" для написания фоновой рисовалки. Хотел попробовать что-то в этом духе года с 2011, но всё время откладывал и забывал Улыбающийся

PS было интересно ^.^

Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #50 : Декабрь 26, 2013, 20:42 »

Вот все 100 итерации завершены, ушли на цикл событий, а там уже ждет paint который просто отрисует комбик - без всякой заливки которая уже не нужна.
А как во время итераций обрабатываются остальные события вроде нажатия на кнопку отмены текущей операции?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #51 : Декабрь 26, 2013, 21:11 »

Ваш пример будет работать только при итеративной отрисовке с быстрыми "тиками", я так понимаю.
Этот пример да, а вообще не только. Часто встречается ситуевина когда операция модальна/монопольна, напр юзверь схватил объект и тащит. Перерисовываться надо, но вот др события не должны извлекаться из очереди пока мыша не отпущена.

А как во время итераций обрабатываются остальные события вроде нажатия на кнопку отмены текущей операции?
Этого никто не отменял, и об этом я создал др топик  Улыбающийся
http://www.prog.org.ru/index.php?topic=26251.msg187843#msg187843
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #52 : Декабрь 26, 2013, 22:50 »

Часто встречается ситуевина когда операция модальна/монопольна, напр юзверь схватил объект и тащит. Перерисовываться надо, но вот др события не должны извлекаться из очереди пока мыша не отпущена.
Ох уж эти обобщения... "Часто встречается"... У кого часто встречается? Кому это надо? Улыбающийся
Посмотрите как реализован DnD в том же Qt, там нет таких странных ограничений.
С какой стати сообщения не должны извлекаться и обрабатываться?
« Последнее редактирование: Декабрь 26, 2013, 22:59 от Old » Записан
Bepec
Гость
« Ответ #53 : Декабрь 26, 2013, 23:11 »

Old, прошу вас, остановитесь Веселый Тема уже почти почти завершена Веселый
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #54 : Декабрь 26, 2013, 23:47 »

Old, прошу вас, остановитесь Веселый Тема уже почти почти завершена Веселый
Правда интересно, почему нам непонятные требования пытаются выдать за само собой разумеющиеся. Улыбающийся
В принципе, как всегда... но я не перестаю удивляться. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #55 : Декабрь 27, 2013, 13:55 »

Правда интересно, почему нам непонятные требования пытаются выдать за само собой разумеющиеся. Улыбающийся
В принципе, как всегда... но я не перестаю удивляться. Улыбающийся
"нам" - за всех не расписывайтесь Улыбающийся Есть портируемое приложение которое делает вещи так, и наивно думать что все будет "так же как в Qt". Еще более наивно "следовать Qt примерам-образцам" пытаясь подогнать приложение под них.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #56 : Декабрь 27, 2013, 15:07 »

"нам" - за всех не расписывайтесь Улыбающийся
А вы пишете для кого-то конкретно? Указывайте это, иначе вы пишете нам всем. Улыбающийся

Есть портируемое приложение которое делает вещи так, и наивно думать что все будет "так же как в Qt".
Наивно называть приложение сделанное через жопу - "часто встречается". Улыбающийся
Написали бы правду, не было бы моих комментариев.
« Последнее редактирование: Декабрь 27, 2013, 15:12 от Old » Записан
Bepec
Гость
« Ответ #57 : Декабрь 27, 2013, 15:15 »

Не буду холиварить, но поддержу Old.
Ибо если один у нас ходит кверх ногами, это не повод всех переучивать в принудительном порядке. Проще прописать этому "одному" лечебных процедур.

PS вы всегда можете скрыть реализацию от приложения. И только вы будете знать как жутко вы обманываете бедную и беззащитную программу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #58 : Декабрь 27, 2013, 15:45 »

Наивно называть приложение сделанное через жопу - "часто встречается". Улыбающийся
Написали бы правду, не было бы моих комментариев.
Ну вот Вы уже и грубите Улыбающийся А что же плохого делает приложение? Конечно, рисовать так необязательно, но что в этом некорректного/неграмотного? Я лично ничего не нашел, в обоих используемых ОС это 100% легально. Хорошо, давайте "переделаем по Qt-шному", но никаких Ваших предложений я не видел. Чего ж теперь Вы жопу вспомнили?  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #59 : Декабрь 27, 2013, 15:51 »

А что же плохого делает приложение?
Причем здесь приложение?
Меня удивила формулировка "часто встречается" и "перерисовывать надо, а события обрабатывать нет".
Это абсурдные требования, которые вы решили представить как само собой разумеющиеся.
Именно это я прокомментировал.

Хорошо, давайте "переделаем по Qt-шному", но никаких Ваших предложений я не видел.
Никакого "Qt-шного" нет, это штатное рисование для большинства (если не всех) платформ.
Или на маках не нужно обрабатывать сообщение типа paintEvent?
« Последнее редактирование: Декабрь 27, 2013, 16:02 от Old » Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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