![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
SABROG |
![]() ![]()
Сообщение
#1
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Есть желание рисовать на дочерних окошках, причем хочется оставить их оригинальный render и рисовать поверх уже готовой картинки. Ввиду того, что дочерних элементов может быть сколько угодно, я не могу (а скорее не хочу) унаследоваться от каждого из них. Поэтому я использую installEventFilter.
Получился такой код:
Но не получается. Если убрать первый QObject::eventFilter(o, e);, то виджет рисуется поверх линии, т.е. она остается на заднем плане. Если оставить, то рисуется вообще только одна линия, оригинального изображения виджета нет. paintEvent вызвать напрямую не могу, т.к. он protected, render() и repaint() приводят к рекурсии, естественно. |
|
|
kwisp |
![]()
Сообщение
#2
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, первая мысля в слух: Стало быть фильтр вызывается до того, как событие будет доставленно адресату. Тогда надо помозговать исходя из этой ситуации
Несколько мимо темы, такой код: QPaintEvent *pe = (QPaintEvent *)e; стиль приведения не С++ный, а Сишный, и уж точно не принятый в Qt (qobject_cast<>, надобы)
QWidget *w = (QWidget *)o; |
|
|
SABROG |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
поясни пожалуйста что это такое? Что-то типа QPixmap::grabWidget()
Оригинальный отрисовщик, который в paintEvent'e. SABROG, первая мысля в слух: Стало быть фильтр вызывается до того, как событие будет доставленно адресату. Тогда надо помозговать исходя из этой ситуации Давайте обмозгуем. Думаю postEvent тут тоже не поможет, т.к. опять будет рекурсия. Возможно флагами как-то, каждому объекту присвоить флаг (QMap)? Сначала вызвать оригинальный eventFilter, выставить flag в 1, потом как-то сгенерить опять событие, но при этом, чтобы старая картинка не затиралась. Сообщение отредактировал SABROG - 26.5.2009, 12:17 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Думаю postEvent'ом тут тоже не обойтись, т.к. опять будет рекурсия. дело даже не в рекурсии, обсуждалось недавно, что событие рисования посылать получается, да вот рисовальщик (QPainter) ругается.потом попробовать отрисовать что-то поверх а как попробовать рисовать мимо события рисования, на виджетах ведь можно рисовать только в их обработчике рисования.
|
|
|
SABROG |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Через флаг не получилось. Второй paintEvent затирает как-то все, что было до этого.
Цитата а как попробовать рисовать мимо события рисования, на виджетах ведь можно рисовать только в их обработчике рисования. В момент события QEvent::Paint из любого места, не обязательно внутри paintEvent метода. Сообщение отредактировал SABROG - 26.5.2009, 12:36 |
|
|
kwisp |
![]()
Сообщение
#7
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Второй paintEvent затирает как-то все, что было до этого. в доке написано что пред вызовом нового обработчика все стирается. чтоб этого избежать используют updete(QRect) SABROG, вообще как я понимаю. если дочерние элементы находятся на хозяине то рисовать на них нет труда в обраьботчике хозяина рисуй и всё. в вот если к примеру диалог или окошко сообщений то тут задачка..... может попробовать рисовать то что хочется на картинке а потом картинку лепить на дочернее окошко. --------------- нет оказывается затруднительно рисовать на дочерних элементах даже если они на хозяине ![]() Сообщение отредактировал kwisp - 26.5.2009, 12:46 |
|
|
SABROG |
![]()
Сообщение
#8
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
вообще как я понимаю. если дочерние элементы находятся на хозяине то рисовать на них нет труда в обраьботчике хозяина рисуй и всё. А ты попробуй, ничего не получится. Как ни изгаляйся, а рисование на родителе всегда будет позади детей. Может попробовать рисовать то что хочется на картинке а потом картинку лепить на дочернее окошко. Если ты добавляешь детей в окно, то они отображаются. Если ты их скрываешь через setVisible(false)/hide(), то они естественно не будут вести себя как нормальные видимые дети, события обрабатываться не будут, анимация и обновление происходить не будут. Заставить их прорисоваться через QWidget::render можно, но вот как от них избавиться, чтобы реально их на экране не было - вопрос. На ум приходит что-то типа послать по далеким далеким координатам, за пределы виджета, но тут сразу возникает вопрос с корректировкой координат и событий клавиатуры и мыши. Опять же наверняка будут проблемы. Есть еще вариант с дополнительным виджетом-прослойкой. Эта тема как-раз создана для того, чтобы избежать такого решения, т.к. виджет-прослойка это не рисование, а по сути хак. Я вообще троллей не понимаю в связи с этим, вроде всё можно, вроде рисовать можно как хочешь, а вот поверх всего только в примере overpainting QGlWidget'a. Бред... |
|
|
kwisp |
![]()
Сообщение
#9
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#10
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#11
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#12
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В другом методе например, вызываемым внутри eventFilter'a. ну это и будет в фильтре событий.Всё, что я хочу сказать, это то, что на методе paintEvent свет не сошелся при отрисовке, главное создать правильные условия/событие. Но мы отклонились от темы, рисовать не вопрос. void QWidget::update ( const QRect & rect ) - не знаю как его можно прикрутить к фильтру событий, это надо его как-то вызвать на ребенке, чтобы он и линию не затер и себя смог отрисовать, врятли это возможно. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, для случая не окна, глянь-ка сюда
и ещё вот как делают троли: интересные места выделены в коментариях
|
|
|
SABROG |
![]()
Сообщение
#14
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
До этих мест я добрался уже давно, но никак не могу понять в чем разница. Если ключ в QApplication::sendEvent(object, event);, то почему у меня это приводит к рекурсии и как следствие к крашу...
--- Тэкс похоже этот m_widget что-то типа моего флага:
Сообщение отредактировал SABROG - 26.5.2009, 16:25 |
|
|
kwisp |
![]()
Сообщение
#15
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#16
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Похоже получается.
![]() Как я понял sendEvent вызывает цикл eventFilter еще раз и таким образом заставляет нарисоваться виджетам. А нулевой m_widget (в моем случае обычный flag типа bool) нужен, чтобы прервать бесконечный цикл. Значит я все-таки рыл в правильную сторону. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#17
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#18
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Похоже получается. т.е. эти чёрные линии ты нарисовал поверх виджета в фильтре событий?Первая линия рисуется для centralWidget(), вторая для его чайлдов, в данном случае это только QGroupBox, т.к. надо еще писать функцию рекурсии, чтобы пройтись по всему дереву, а у меня пока руки не дошли. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#19
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
а можешь тестовый примерчик вылочить, с минимумом виджетов. Найду время тоже побалуюсь.
|
|
|
SABROG |
![]()
Сообщение
#20
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#21
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Накатал простенький пример. Правда не самый удачный, т.к. не показывает преимущества технологии. Отличить от обычного paintEvent'a не получится, но тем не менее шрифт, который обычно рисуется на фоне - рисуется поверх вводимого текста.
![]() Сообщение отредактировал SABROG - 26.5.2009, 18:26
Прикрепленные файлы
|
|
|
SABROG |
![]()
Сообщение
#22
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Господа, поздравьте меня. Наконец-то я это сделал:
![]() |
|
|
DmP |
![]()
Сообщение
#23
|
Студент ![]() Группа: Участник Сообщений: 61 Регистрация: 11.3.2008 Пользователь №: 116 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, сорри за офтоп, но чем делаются такие картинки?
|
|
|
SABROG |
![]()
Сообщение
#24
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, сорри за офтоп, но чем делаются такие картинки? Camtasia Studio. Несколько мимо темы, такой код: Цитата(SABROG @ 26.5.2009, 15:52) * QPaintEvent *pe = (QPaintEvent *)e; QWidget *w = (QWidget *)o; стиль приведения не С++ный, а Сишный, и уж точно не принятый в Qt (qobject_cast<>, надобы) Грешу понемногу, хочется как обычно сделать быстро, а вспоминать является ли QEvent - QObject'ом влом ![]() ![]() Сообщение отредактировал SABROG - 26.5.2009, 21:24 |
|
|
igor_bogomolov |
![]()
Сообщение
#25
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Может я что то делаю не так, но нарисовать что то приемлемое у меня не получается. Не подскажешь как координаты привести к единым. Т.е. как провести прямую линию через несколько виджетов, и она при этом не ломалась.
![]() Раскрывающийся текст
|
|
|
SABROG |
![]()
Сообщение
#26
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Я об этом думал и хотел попробовать завтра такую штуку (исходники на работе остались):
- даем знать в eventFilter какое окно у нас главное и вместо flag используем указатель на главное окно (QObject/QWidget) - делаем repaint для главного окна - если QEvent::Paint приходит для главного окна, то сбрасываем переменную-флаг где содержится указатель на главное окно в 0 таким образом, чтобы следующая проверка вызывала оригинальный обработчик (QObject::eventFilter(o, e); - вызываем QApplication::sendEvent() - т.к. у нас переменная 0, то должна произойти отрисовка всех дочерних окон - после возврата из sendEvent рисуем на главном окне |
|
|
igor_bogomolov |
![]()
Сообщение
#27
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
kwisp |
![]()
Сообщение
#28
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov,
на каждом виджете в отдельности получилось нарисавать, почему бы просто не рассчитать где должна находится линия на каждом виджете чтоб при совмещении получилась одна прямая.. хотя может криво получится ![]() |
|
|
SABROG |
![]()
Сообщение
#29
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Так ведь ничего не нарисуется. Точнее, линия так и останется под другими виджетами. Иначе в своем коде, который я привел чуть выше, я бы уже получил нормальную прямую линию. Или я чего то не допонял??? Пока есть такое предположение. Т.к. ты установил фильтры на каждый компонент, то событий приходит 3-4. В каждом таком событии ты вызываешь оригинальный обработчик для каждого из фильтрованных виджетов. В результате не получается цепочки типа Родитель->Ребенок1->Ребенок2. А получается несколько отдельных вызовов, которые не связаны: Родитель-Оригинальный обработчик-Свой обработчик Ребенок1-Оригинальный обработчик-Свой обработчик Ребенок2-Оригинальный обработчик-Свой обработчик По идее, если установить фильтр только на главное окно и через sendEvent отправить событие отрисовки, то все дети должны перерисоваться сами и после того как они это сделают управление вернется обратно в фильтр событий, где мы и отрисуем то, что нам надо поверх всего этого. Но как я сказал это пока предположение, проверить я смогу на работе. |
|
|
igor_bogomolov |
![]()
Сообщение
#30
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
на каждом виджете в отдельности получилось нарисавать, почему бы просто не рассчитать где должна находится линия на каждом виджете чтоб при совмещении получилась одна прямая.. Не подскажешь как координаты привести к единым. Т.е. как провести прямую линию через несколько виджетов, и она при этом не ломалась. Как раз это у меня не получается. Не знаю, как координаты привести. Это единственный выход в нашей ситуации. Если заменить p.setViewport(rect()) на p.setWindow(qobject_cast<QWidget*>(obj)->geometry()), линии практически совпадают. Тут проблемы возникают с методом geometry, возвращает неправильные координаты и размеры. |
|
|
kwisp |
![]()
Сообщение
#31
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
igor_bogomolov |
![]()
Сообщение
#32
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
если установить фильтр только на главное окно Тогда, в eventFilter(QObject *obj, QEvent *event) obj == главное окно, например QDialogДалее через sendEvent отправить событие отрисовки QApplication::sendEvent(obj, event); т.е. ты отрисуешь только сам QDialog. Никаких child-ов здесь отрисовано не будет!!!!!правление вернется обратно в фильтр событий Здесь мы отрисуюем то что мы хотим, только по QDialog.Теперь когда мы выйдем из евентфильтра, поверх QDialog нарисуются child-ы, затерев собой то что мы рисовали. Другимим словами, предложенный тобой способ, позволяет нарисовать оригинальный виджет, для которого установлен фильтр, + что-то поверх него. Если ты попытаешься в обработчике события главного окна, принудительно выздать обработчик события его потомков, в лучшем случае получишь ошибку QPainter-а, иначе просто крашь. kwisp, если интересно, возьми мой тестовый проект. Может у тебя получится нормально координаты привести. kwisp, Если соберешь проект, увидешь, что через кнопку линия рисуется правильно. Для QTextEdit метод geometry почему то возвращает неправильные координыты? Как с этим бороться?
Прикрепленные файлы
|
|
|
kwisp |
![]()
Сообщение
#33
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov,
готово проблема в viewport() он возвращает не совсем точную геометрию текседита. я так написал криво извини я всетаки на работе думаю понятно Раскрывающийся текст
|
|
|
igor_bogomolov |
![]()
Сообщение
#34
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
kwisp, все правильно. Сам только что до этого додумался. Дело в том что viewport возвращем координаты относительно QTextEdit.
Блин, как все усложняется, относительно составных виджетов. Через QCalendarWidget, вообще непонятно как линию провести. Но уже почти. Немного осталось додумать. Нужен универсальный способ получить координаты любого виджета, относительно главного окна. Сообщение отредактировал igor_bogomolov - 27.5.2009, 10:35 |
|
|
Kagami |
![]()
Сообщение
#35
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Можно подумать в эту сторону
Раскрывающийся текст Цитата QPoint QWidget::mapTo ( QWidget * parent, const QPoint & pos ) const Translates the widget coordinate pos to the coordinate system of parent. The parent must not be 0 and must be a parent of the calling widget. See also mapFrom(), mapToParent(), mapToGlobal(), and underMouse(). QPoint QWidget::mapToGlobal ( const QPoint & pos ) const Translates the widget coordinate pos to global screen coordinates. For example, mapToGlobal(QPoint(0,0)) would give the global coordinates of the top-left pixel of the widget. See also mapFromGlobal(), mapTo(), and mapToParent(). QPoint QWidget::mapToParent ( const QPoint & pos ) const Translates the widget coordinate pos to a coordinate in the parent widget. Same as mapToGlobal() if the widget has no parent. See also mapFromParent(), mapTo(), mapToGlobal(), and underMouse(). |
|
|
igor_bogomolov |
![]()
Сообщение
#36
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Можно подумать в эту сторону Надо посмотреть.Пока решил так. Работает на ура. Раскрывающийся текст
![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#37
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
![]() |
|
|
SABROG |
![]()
Сообщение
#38
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В общем затык на отрисовке чайлдов. Как я понял схема такая repaint()->repaint_sys()->QWidgetPrivate::drawWidget(и тут рекурсия этого drawWidget на всех чайлдах). Но похоже я что-то упускаю, как-то надо QPainter инициализировать чтоль, но это уже похоже надо лезть в трусы к QWidgetPrivate членам.
Насчет всех чайлдов. Я такую функцию написал:
Юзать так:
P.S.: теперь вариант с прозрачным QWidget'ом поверх всех окон мне кажется не таким уж и плохим вариантом. Но я еще не сдался ![]() Сообщение отредактировал SABROG - 27.5.2009, 12:38 |
|
|
igor_bogomolov |
![]()
Сообщение
#39
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
В общем затык на отрисовке чайлдов. Как я понял схема такая repaint()->repaint_sys()->QWidgetPrivate::drawWidget(и тут рекурсия этого drawWidget на всех чайлдах). Но похоже я что-то упускаю, как-то надо QPainter инициализировать чтоль, но это уже похоже надо лезть в трусы к QWidgetPrivate членам. Ничего не понял, если честно. Но с трусами и членами силно завернул.childsRecursive заюзал. Все работает. Удобно. Так я что-то и не понял, что тебя не устраивает??? Задачу решили, на мой взглян, хорошо. Работает и рисует как надо. |
|
|
SABROG |
![]()
Сообщение
#40
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В общем затык на отрисовке чайлдов. Как я понял схема такая repaint()->repaint_sys()->QWidgetPrivate::drawWidget(и тут рекурсия этого drawWidget на всех чайлдах). Но похоже я что-то упускаю, как-то надо QPainter инициализировать чтоль, но это уже похоже надо лезть в трусы к QWidgetPrivate членам. Ничего не понял, если честно. Но с трусами и членами силно завернул.childsRecursive заюзал. Все работает. Удобно. Так я что-то и не понял, что тебя не устраивает??? Задачу решили, на мой взглян, хорошо. Работает и рисует как надо. Оверхед сплошной ![]()
По сути тоже самое, что и grabWidget(). Но тут отличие в том, что сгенеренный эвент срабатывает и окно (без детей) рисуется в файл. Если вместо &pix редиректнуть на другой виджет, то уже не пашет. |
|
|
igor_bogomolov |
![]()
Сообщение
#41
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
У меня на сегодня уже перенагрузка мозга пошла. Вообще перестал что либо понимать. Так что не ругайте если что.
отрисовать только одно окно не вызывая при этом перерисовку (генерацию эвентов перерисовки) для дочерних окон О каких окнах речь идет? И причем здесь вообще окна? Задача, как я изначально понял, бала - найти возможность рисовать поверх виджетов. Если у тебя два окна, у них раззные циклы обработки событий. Или ты хочешь сказать, что если я имею два диалоговых окна, изменю размер одного, для второго придет событие на перерисовку? |
|
|
SABROG |
![]()
Сообщение
#42
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Виджет.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#43
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#44
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Господа, поздравьте меня. Наконец-то я это сделал: Я что-то непонял, причём здесь покрашеное в чёрный цвет окно?![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#45
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Тебя смущает двойной вызов обработчика события рисования для каждого виджета? Я правильно понимаю?
Но вызов ни к чему не приведет. Событие вызовится, но QPainter.begin() вернет false. Мы это уже недавно обсуждали, где то в теме есть ссылочка.Тагда приходим к тому же самому. Нужно разбираться как работает метод update(). У меня разобраться не получилось. Может ты сможешь. Помоему предложенный вариант тоже неплох. Свою задачу он выполняет. ![]() |
|
|
SABROG |
![]()
Сообщение
#46
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
У меня разобраться не получилось Да вот у меня тоже не получается. Слишком уж много там проверок всяческих. Например в момент отрисовки виджету ставится спец.аттрибут:
и походу именно таким образом он определяет, что QPainter пытается рисовать в paintEvent'e. Пытался симулировать, не получилось. Сейчас затык видимо в paintEngine. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#47
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, я к тому, что вроде была для этого отдельная тема
|
|
|
igor_bogomolov |
![]()
Сообщение
#48
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Я думаю, другого способа мы не найдем. Дело в том, что после обработки события рисования родительского виджета, всегда генерируются события рисования для чайлдов. Поэтому, даже если найдется способ, в событии рисования родителя, методом sendEvetn, отрисовать все его чайлды, при выходе они сгенерируются снова, и затрут, то что мы нарисовали. Проигнорировать эти события не получается, т.е.
положительного результата не даст. Фон все равно отрисуется.Так что думаю, придется смириться с двойной перерисовкой каждого виджета. По моему, не так уж это накладно для современных компьютеров. Меня такой вот финт ушами, вполне устраивает. Вы как считаете??? Тем более двойной перерисовки здесь нет. ![]() Сообщение отредактировал igor_bogomolov - 27.5.2009, 16:42 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#49
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
а что если после собственного рисования, запрещать виджету обновлятся?
setUpdateEnable(false) |
|
|
SABROG |
![]()
Сообщение
#50
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
а что если после собственного рисования, запрещать виджету обновлятся? setUpdateEnable(false) В рекурсии поставил setUpdates(false) каждому чайлду, в итоге это привело к тому, что дети просто очистились, ну и окно естественно тоже на котором я пытаюсь что-то нарисовать. Это надо еще как-то отключать auto erase для виджетов. Сообщение отредактировал SABROG - 27.5.2009, 17:34 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#51
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
а есть ещё такая штука как двойная буферизация, её можно запрещать.
|
|
|
igor_bogomolov |
![]()
Сообщение
#52
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#53
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
а есть ещё такая штука как двойная буферизация, её можно запрещать. Установка флагов Qt::WA_PaintOnScreen или Qt::WA_PaintOnScreen для детей приводит к крашу, также как и w->setAutoFillBackground(false); --- Пардон, это я забыл одно место раскомментировать. В общем всё равно флаги ничем не помогли, autoFillBackground(false) сделал у QListWidget'a фон списка не белым, а как у основного окна. Сообщение отредактировал SABROG - 27.5.2009, 18:06 |
|
|
igor_bogomolov |
![]()
Сообщение
#54
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, да объясни же, чем не устраивает полученное решение
|
|
|
SABROG |
![]()
Сообщение
#55
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, да объясни же, чем не устраивает полученное решение Ну вот если рисовать QPixmap, он же по идее будет рисоваться медленней с ростом количества окон, да и на скрине почему-то в некоторых местах у тебя синяя рамка перекрывает красные линии. К тому же как я уже говорил тут возникает проблема с прозрачностью. Прозрачный фон у виджетов накладывается друг на друга и в итоге я получаю совсем другой цвет. Да и сама по себе проблема до конца не решена. Сообщение отредактировал SABROG - 27.5.2009, 18:12 |
|
|
igor_bogomolov |
![]()
Сообщение
#56
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
на скрине почему-то в некоторых местах у тебя синяя рамка перекрывает красные линии В моем примере фильтр устоновлен для textedit->viewport(), для самого textedit - не установлен. Если восползоваться твоей функцией childsRecursive, все будет рисоваться нормально.проблема с прозрачностью Эт я не проверял. Надо будет посмотреть.Да и сама по себе проблема до конца не решена. Поподробнее. Что не решено. Для чего понадобилось рисовать поверх виджетов? Только для этого |
|
|
SABROG |
![]()
Сообщение
#57
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Много чего придумать можно. Тот же эффект падающего снега. Разные спец.эффекты.
Похоже уже есть смысл копать в сторону backingstore и paintEngine. Сообщение отредактировал SABROG - 27.5.2009, 20:00 |
|
|
igor_bogomolov |
![]()
Сообщение
#58
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
это альфа-канал, который ставится каждому чайлду. Но из-за того, что прозрачные бэкграунды наслаиваются друг на друга местами альфа-канал суммируется и происходит лажа. Назнач для кождого такого виджета, с которым лажа происходит, свойство setAutoFillBackground(true). Лажа пропадет ![]() ![]() |
|
|
SABROG |
![]()
Сообщение
#59
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Ладно, чтобы завершить тему, можешь выложить пример, где бы поверх чайлдов рисовалась картинка с альфа-каналом?
А то я уже устал, если честно. |
|
|
igor_bogomolov |
![]()
Сообщение
#60
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Ладно, чтобы завершить тему, можешь выложить пример, где бы поверх чайлдов рисовалась картинка с альфа-каналом? Могу конечно. Подчищу проек немного от экспериментов, выложу.А то я уже устал, если честно. Это твоя тема, тебе решать. Я лишь помочь пытался, в силу своих возможностей.Transparent Backgrounds in Qt 4.1 |
|
|
SABROG |
![]()
Сообщение
#61
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Меня не столько исходники интересуют, сколько скриншот с результатом
![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#62
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Меня не столько исходники интересуют, сколько скриншот с результатом ??? Какой от него толк, от скриншота?Исходники прилагаю, скриншот есть. Картинку сам поменяешь, если что. У меня их просто нет. ![]()
Прикрепленные файлы
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#63
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Вот для эфекта затемнения я бы просто палитру окошка менял перед паказом диалога. И альфа канал бы не использовал, за ненадобностью. Т.к. само окошко все равно не прозрачное.
|
|
|
SABROG |
![]()
Сообщение
#64
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Вот для эфекта затемнения я бы просто палитру окошка менял перед паказом диалога. И альфа канал бы не использовал, за ненадобностью. Т.к. само окошко все равно не прозрачное. Я думал над этим, но это не решение, а обход реальной задачи. igor_bogomolov, думаю я теперь созрел, чтобы принять этот вариант как окончательный на данный момент. Можно начать писать статью в wiki. Осталось лишь подумать еще над возможностью добавить прозрачную анимацию. Сообщение отредактировал SABROG - 28.5.2009, 8:23 |
|
|
igor_bogomolov |
![]()
Сообщение
#65
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Осталось лишь подумать еще над возможностью добавить прозрачную анимацию. Я вчера ночью, перед тем как выложить пример, немного поэксперементировал. Как раз таки хотел сделать сюрприз и выложить демку с эфектом падающего снега. Сделал 5 прозрачных пнг-шег с хаотично расположенными снижинками. По таймеру - перерисовывал эти картинки, вызывая update() для окна. Оказалось, что таким образом перерисовываются только те виджеты у которых свойство setAutoFillBackground(false). Виджеты с установленным свойством в true, почему то перерисовку игнорируют. Так что у меня вопрос - чем отличаются события перерисовки через update() и от тех событий которые происходят при ресайзе? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#66
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
чем отличаются события перерисовки через update() и от тех событий которые происходят при ресайзе? на память: update() - групирует события поэтому его рекомендуют использовать для повышения производительности. Т.е. пачка из нескольких событий рисования будет превращена в одно.Цитата void QWidget::update () [slot] тык... This function does not cause an immediate repaint; instead it schedules a paint event for processing when Qt returns to the main event loop. This permits Qt to optimize for more speed and less flicker than a call to repaint() does. Calling update() several times normally results in just one paintEvent() call. Цитата void QWidget::repaint () [slot] тыкRepaints the widget directly by calling paintEvent() immediately, unless updates are disabled or the widget is hidden. We suggest only using repaint() if you need an immediate repaint, for example during animation. In almost all circumstances update() is better, as it permits Qt to optimize for speed and minimize flicker. Warning: If you call repaint() in a function which may itself be called from paintEvent(), you may get infinite recursion. The update() function never causes recursion. на память немного промазал, групируются не события, а вызовы update() |
|
|
igor_bogomolov |
![]()
Сообщение
#67
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Все поправил. Теперь и анимация работает нормально.
Прилагаю изменёный проектик. В нем по таймеру перерисовываются звездочки. Получается как анимация. При нажатии на кнопку рисуется затемненный прозрачный фон. SABROG, у меня на работе нет возможности сделать гифку, если нетрудно, скомпилируй проектик, засними, и размести здесь. Что бы вроде как итог подвести. Ну и теперь на самом деле можешь писать статью ![]() Сообщение отредактировал igor_bogomolov - 28.5.2009, 11:04
Прикрепленные файлы
|
|
|
SABROG |
![]()
Сообщение
#68
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
![]() Написал в wiki как смог, если есть желающие добавить или поправить - милости прошу. Сообщение отредактировал SABROG - 28.5.2009, 12:48 |
|
|
SABROG |
![]()
Сообщение
#69
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
wasyota мне дал любопытную ссылочку http://www.qtcentre.org/forum/f-qt-program...lter-12287.html
|
|
|
igor_bogomolov |
![]()
Сообщение
#70
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
wasyota мне дал любопытную ссылочку http://www.qtcentre.org/forum/f-qt-program...lter-12287.html Я еще с утра это посмотрел. Что толку. В Qt PostEventFilter пока нет. Но реализацию было бы все равно интересно посмотреть. Приатач сюда posteventfilter.h, а то неохото региться там только из-за этого
|
|
|
SABROG |
![]()
Сообщение
#71
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
igor_bogomolov |
![]()
Сообщение
#72
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Написал в wiki как смог, если есть желающие добавить или поправить - милости прошу. Хорошая статья получилась. Не зря мучились почти три дня.Еще бы ссылочку на эту дему добавить, если вдруг кто то захочет задать вопросс. Сообщение отредактировал igor_bogomolov - 28.5.2009, 13:32 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#73
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, а что если теперь запустить ссылкой в qt-apps?
(через гугл переводчик) |
|
|
SABROG |
![]()
Сообщение
#74
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, а что если теперь запустить ссылкой в qt-apps? (через гугл переводчик) Поподробней отсюда, я ничего не понял ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#75
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
ну на qt-apps, кто-то утверждал, что задачка не для Qt. Если я ничего не перепутал.
Дак вот дать им ссылку на нашу вики, типа вот как всё это можно сделать. Дать ссылку на оригинал и на гугловский перевод, чтоб по аглицки могли почитать. |
|
|
igor_bogomolov |
![]()
Сообщение
#76
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#77
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
![]() Щас обновлю все-таки последнюю тему, добавлю туда ссылочку. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#78
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Ах, да qtcentre.org, конечно, а не qt-apps
|
|
|
SABROG |
![]()
Сообщение
#79
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Вопрос. А ведь QRubberBand тоже рисуется поверх виджетов?
--- Вопрос отпал, это тот самый прослойчатый виджет:
--- Отличие PostEventFilter'а от нашего метода в том, что там переопределяется метод event() вместо installEventFilter'a, ну и соответственно вызывается сначала оригинальный обработчик, а после него вызывается метод postEventFilter. Хуже он тем, что работает только на одном виджете и соответственно каждый такой виджет надо наследовать. Сообщение отредактировал SABROG - 28.5.2009, 16:56 |
|
|
igor_bogomolov |
![]()
Сообщение
#80
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Хуже он тем, что работает только на одном виджете и соответственно каждый такой виджет надо наследовать. Такой метод нам явно не подходит. Наш метод однозначно лучше. Твою статью можно смело в QQ размещать ![]() -------------------------------------------------------------------------------- Наконец то научился работать с гиф анимацией через Qt, не воспроизводя ее в QLabel. ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#81
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov, Прикольно получилось
|
|
|
ViGOur |
![]()
Сообщение
#82
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Kagami |
![]()
Сообщение
#83
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov, выложи, пожалуйста, исходники с мужиком
![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#84
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami) igor_bogomolov, выложи, пожалуйста, исходники с мужиком Выкладываю. Правда координаты где мужика рисую я жестко задавал. Цель была разобраться как работать с гиф анимацией, т.е. считывать кадр из гифки.
Прикрепленные файлы
|
|
|
ViGOur |
![]()
Сообщение
#85
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov, выложил твоего мужика на сайт: http://www.crossplatform.ru/node/887. Скорее всего не только Kagami будет интересно посмотреть.
Как зайдешь на сайт, смогу тебе сделать автором данного исходника, чтобы мог поправить или добавить описание. Просто как я понял ты туда ниразу не заходил, по крайней мере залогиненым на форуме. ![]() Сообщение отредактировал ViGOur - 29.5.2009, 7:57 |
|
|
igor_bogomolov |
![]()
Сообщение
#86
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Просто как я понял ты туда ниразу не заходил, по крайней мере залогиненым на форуме. Так это же главная страница сайта. Всегда на форум захожу через неё. А регистрация по всему ресурсу автоматическая. Сегодня при входе был приятно удивлён, увидев там знакомого мужика."Работа с гиф анимацией" - на данный момент звучит очень громко. Там десяти строк не наберется. За все отвечает класс QImageReader, с которым я до конца так и не разобрамся. По данному вопросу я новую тему создам чуть позже. Предлогаю переименовать "Работа с гиф анимацией". Там всетаки вся прелесть не в работе с гиф, а в самом методе рисования. SABROG использовал термин overpainting. Может стоит его придерживаться? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#87
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ViGOur |
![]()
Сообщение
#88
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Это я сам дурак, ограничение в запросе стояло, потому тебя и не нашел.
Сделал тебя автором статьи-исходника, так что можешь поправить как хочешь. ![]() |
|
|
ViGOur |
![]()
Сообщение
#89
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Блин, вот думаю исходник SUBROG'a выкладывать на сайте или нет? В принципе есть статья в вики.
Просто он также интересен и полезен! ![]() |
|
|
igor_bogomolov |
![]()
Сообщение
#90
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
igor_bogomolov, выложил твоего мужика на сайт Блин, вот думаю исходник SUBROG'a выкладывать на сайте или нет? Это один и тот же код ![]() Цитата(igor_bogomolov) Там всетаки вся прелесть не в работе с гиф, а в самом методе рисования.
|
|
|
ViGOur |
![]()
Сообщение
#91
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#92
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
может вообще не стоит русский аналог искать а писать просто по русски оверрисование. стОит. Надо подумать, здесь
|
|
|
SABROG |
![]() ![]()
Сообщение
#93
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Не должно muzhik'у быть одному, поэтому я склепал ему бабу.
![]() Решил попробовать схожий метод перехвата эвентов, но уже в глобальном виде - через переопределение QApplication::notify(). Принцип почти такой же за исключением того, что здесь не нужно использовать installEventFilter и рекурсию по детям.
В примере используется .mng анимация с классом QMovie. Есть баги, требующие доработки. Исходники. |
|
|
SABROG |
![]()
Сообщение
#94
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Это тролли так шутят или они действительно планируют все-таки реализовать подобный функционал в Qt 5.0.0?
http://bugreports.qt.nokia.com/browse/QTBUG-1615 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#95
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Ну, а почему бы в 5-ке этому не появится (пострисованию)
|
|
|
SABROG |
![]()
Сообщение
#96
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
BRE |
![]()
Сообщение
#97
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#98
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Думаю год два.... да быстрее и не надо, а то там каки будут.Да и судя по странице проекта Qt в разделе версии целая куча всего, что отложено на "после 5-ки" Цитата 4.5.2 1 4.5.3 11 4.5.4 (Next Patch Release) 44 4.6.0 (Next Minor Release) 424 4.6.1 (Next Patch Release) 1 4.6.x 67 4.7.x 10 5.0.0 (Next Major Release) 80 Some future release Стало быть 5-ки слишком долго ждать не прийдётся. Одно интересно ВинХП похоронят в 5-ке или нет |
|
|
Litkevich Yuriy |
![]()
Сообщение
#99
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Тему разделил: Ализе́ Жакоте
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#100
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Может будет интересно: тык
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 23.4.2025, 4:21 |