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

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

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: Портирование рисования  (Прочитано 26039 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

Код:
update()
repaint()
Вот только repaint вызывает немедленное обновление Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Это какие?
Да хотя бы
CGContextFlush
CGContextSynchronize
QDFlushPortBuffer

Напр здесь говорят как грамотно флашить
https://developer.apple.com/library/mac/documentation/performance/Conceptual/Drawing/Articles/FlushingContent.html. Да, и кстати Widget::macCGHandle возвращает тот самый что нужен CG-вызовам. А на бздошном Вындоуз есть как минимум RedrawWindow, (т.е. repaint должен работать) ну ладно, с Вындоуз после

Вот только repaint вызывает немедленное обновление Улыбающийся
Как уже говорили выше - на OSX нет
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Да хотя бы
Про это не знаю и углубляться не буду. Хотя я сильно сомневаюсь, что это вообще возможно в многозадачной среде.

А на бздошном Вындоуз есть как минимум RedrawWindow, (т.е. repaint должен работать) ну ладно, с Вындоуз после
А здесь венда будет посылать сообщения (причем не одно) и отрисовка будет работать в обработчике события.
В иксах также.

Записан
Bepec
Гость
« Ответ #18 : Декабрь 22, 2013, 16:32 »

Хорошо, зайдем с др стороны: а как мне добиться получения paintEvent не трогая при этом др события ? 

Вызов update + processEvents вам не катит? или repaint? В чем отличие от мгновенной отрисовки ? В том, что отрисовка произойдет на полмс позже?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

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

Вызов update + processEvents вам не катит? или repaint? В чем отличие от мгновенной отрисовки ? В том, что отрисовка произойдет на полмс позже?
Просто никакой перерисовки не произойдет. Вот как делается сейчас (без Qt)
Код
C++ (Qt)
if (1) {
OldPainter op(win);
op.PaintRect(&R);
}   // здесь деструктор вытолкнет нарисованный Rect на экран
while (true) {
// здесь что-то делаем достаточно долго, напр неск секунд
}
Заменив OldPainter на QPainter мы получим ошибку - ведь этот код не внутри paintEvent. Придется так
Код
C++ (Qt)
PatchPaintParams(&R);   // надо как-то дать знать что делать внутри paintEvent
repaint();
while (true) {
...
 
При этом еще изрядно искромсав paintEvent. Это уже хреново - и это еще очень мягко сказано.
Но и это еще не все - repaint не сработает на OSX, а если "протолкнуть" его с помощью processEvents то др события будут обрабатываться, а на это код после while совсем не рассчитан.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Старое приложение это делает весьма непринужденно - причем как на OSX, так и на Вындоуз.
И делает это в конечном итоге в обработчике событий аналогичном paintEvent.
Даже в таких библиотеках как SDL, где пользователю кажется, что он работает напрямую с окном, все происходит через события. Это спрятано внутри.

а на это код после while совсем не рассчитан.
Может это стоит исправить и дальше спокойно жить? Улыбающийся
Записан
Bepec
Гость
« Ответ #21 : Декабрь 22, 2013, 18:46 »

Я тебя не понимаю
Просто никакой перерисовки не произойдет. Вот как делается сейчас (без Qt)

Вы сообщеньки читаете? паинтер МОЖЕТ рисовать на чем угодно в любое время, кроме виджетов. Нарисовав на буфере и отдав команду update, вы нарисуете на QImage и paintEvent отрисует этот QImage на виджете. Всё произойдет мгновенно и до while.

PS ну если не верите, сами попробуйте. Вы вот эту цитату написали не попробовав, на одном лишь своём мнении.
« Последнее редактирование: Декабрь 22, 2013, 19:00 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

И делает это в конечном итоге в обработчике событий аналогичном paintEvent.
Точно нет, напр такие вызовы есть в обработчиках мыши, клавы и др.

Может это стоит исправить и дальше спокойно жить? Улыбающийся
Чужой старый код, Сколько всего таких мест - не знаю, найдя первые 10 считать перестал  Улыбающийся

Полазил в отладчике QPainter::begin(). Есть флажок WA_OutsidePaintEvent, но он годится только чтобы заткнуть варнинги консоли. Самого рисования не происходит т.к. нет контекста (CGContextRef) - а он как раз извлекается из события рисования ОС. Подсунуть вроде можно. Поизучаю как создавать контекст нативными средствами  

Вы вот эту цитату написали не попробовав, на одном лишь своём мнении.
Сегодня утром неск раз перепроверил (хотя помнил и раньше). Уверяю Вас, при вызовах update/repaint ну совершенно ничего не происходит Плачущий И в исходниках есть комменты что на OSX это нормально. Заметим что сейчас в приложении рисование (что мы обсуждаем) происходит поверх старого/текущего, поэтому вариант с pixMap совершенно не привлекателен - где хранить все если простыня со скроллом? А валить все в paintEvent (см мой предыдущий пост) - проще застрелиться
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Точно нет, напр такие вызовы есть в обработчиках мыши, клавы и др.
Это не показатель. Все может рисоваться в теневые буферы и на реальный экран выбрасываться при поступлении сообщения от ОС.

Так исходники этой программы есть?
Возможно, она в качестве бекенда для отрисовки использует что-то типа opengl, directx или подобных технологий?
Одной RedrawWindow() дело не закончится, посмотрите ее описание и вы увидите упоминание о всех сообщениях, которые будут слаться главному окну и при обработке которых оно должно все рисовать.

поэтому вариант с pixMap совершенно не привлекателен - где хранить все если простыня со скроллом
С каким скроллом? Улыбающийся
Backbuffer размером с окно (не больше и не меньше) и рисовать на него нужно как на обычное окно.
« Последнее редактирование: Декабрь 22, 2013, 20:27 от Old » Записан
Bepec
Гость
« Ответ #24 : Декабрь 22, 2013, 19:58 »

Т.е. у вас OSX. Опять умолчанная информация ) Это не обвинение, а просто собираю портрет вашей программы Веселый

PS если так хотите заcтрелиться - в Qt как ни странно всё рисуется на QImage в paintEvent Улыбающийся
« Последнее редактирование: Декабрь 22, 2013, 20:00 от Bepec » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Так, ну бычит, правда "с использованием неповторимого местного диалекта" Улыбающийся Исходник прилагаю, нативняк передрал из Qt. Если кто проверит на какаве (у меня стоит сборка Carbon) - буду благодарен. Если мака нет - см скриншот плюс мои уверения что paintEvent и pixMap полностью отсутствуют. Заметим что рисование не затирает предыдущее - как и требовалось.

На Вындоуз пока не знаю, но надеюсь что просто priv->hd = GetDC(..)  и потом конечно ReleaseDC(..)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

PS если так хотите заcтрелиться - в Qt как ни странно всё рисуется на QImage в paintEvent Улыбающийся
Я тоже это слышал, и вот сейчас проверил на drawLine. Рисуется нативными вызовами в контексте  полученном из события рисования ОС (а не на QImage/QPixmap). Что есть тот контекст - личное дело ОС, во всяком случае с double-buffered точно не видео. Обобщать этот результат не стоит - конкретный ОС
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Обобщать этот результат не стоит - конкретный ОС
Точно. Платформопроблемы.
http://qt-project.org/faq/answer/how_does_qtwa_paintonscreen_relate_to_the_backing_store_widget_composition_
Записан
Bepec
Гость
« Ответ #28 : Декабрь 22, 2013, 22:46 »

Рад, что у вас всё получилось Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Рад, что у вас всё получилось Улыбающийся
Ну и чего сидим, на Вындоуз не проверяем? (я недавно винт менял, поэтому даже MSVC не стоит). Там должно быть намного проще, см аттач. Ну отрихтуете что надо, хедерок подкинете.

Смысл простой - QPainter'у нужен контекст (HDC в Вындоуз)
Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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