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

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

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

Сообщений: 4350



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

Ну и чего сидим, на Вындоуз не проверяем?
Если верить этому, то все должно получиться.
http://forum.vingrad.ru/forum/topic-256400.html

Но сохранится ли изображение если окно скрыть и показать или проехаться другим окном?
« Последнее редактирование: Декабрь 23, 2013, 11:17 от Old » Записан
Bepec
Гость
« Ответ #31 : Декабрь 23, 2013, 11:33 »

Зачем что-то пробовать, если независимо в винде на image рисовать мона? Непонятно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Если верить этому, то все должно получиться.
http://forum.vingrad.ru/forum/topic-256400.html
Что на взятом GetDC можно рисовать нативняком сколько угодно - то ясно, но пройдет ли с QPainter?

Но сохранится ли изображение если окно скрыть и показать или проехаться другим окном?
Это рисование "до следующего paintEvent", поэтому если скрыть - все пропало. Если проехаться - то надо переключиться на др окно, но это повлечет paintEvent. Если окно сдвинуть вправо и кликнуть, то нарисованный текст будет за пределами экрана. Если теперь окно сдвинуть влево, то на OSX все норм, текст покажется т.к. сидит в буфере, но на Вындоуз нет, опять paintEvent.

Зачем что-то пробовать, если независимо в винде на image рисовать мона? Непонятно.
Это разные вещи, рисованием на image того же эффекта не достичь. Ну не надо так не надо.     
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Это рисование "до следующего paintEvent", поэтому если скрыть - все пропало.
Ну если такое поведение устраивает... рисовать одно и тоже в нескольких местах.
Записан
Bepec
Гость
« Ответ #34 : Декабрь 23, 2013, 12:25 »

Попробовал. Ничего не рисует.
QPainter::begin: Paint device returned engine == 0, type: 1

Не понял смысла в
Код:
if (1) {
QPainter painter(w);
QString txt = QString::number(++numCall) + " pick";
painter.drawLine(0, 0, 100, 100);
painter.drawText(pt, txt);
}
Ведь мы не внутри paintEvent, пейнтер никогда не даст разрешения.
Если брать DC, то и рисовать надо нативными функциями. Но тогда как и предсказывает Old будет "крайне ненадёжное рисование".
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Ведь мы не внутри paintEvent, пейнтер никогда не даст разрешения.
Если брать DC, то и рисовать надо нативными функциями. Но тогда как и предсказывает Old будет "крайне ненадёжное рисование".
И сразу какая-то паника, неумелый пересказ букваря и ссылка на старшего товарища Улыбающийся Что значит "не даст", кто его спрашивает? Вариант для Вындоуз в аттаче, проверяем
Записан
Bepec
Гость
« Ответ #36 : Декабрь 24, 2013, 17:16 »

Проверить невозможно в виду версии Qt. Просто нет таких хедеров и методов Улыбающийся (как я понял из пятой версии вы их тягаете.)

Не вижу смысла в ваших действиях... Приведи пример пожалуйста, для чего это может пригодиться? Чего нельзя сделать стандартными и понятными любому средствами Qt?

PS Из хлеба можно сделать троллейбус. Но зачем? Вы лезете в недра Qt, ломая систему и мешая следующему наследнику вашего кода шанса разобраться...

PPS смотря на ваш код видится мне, что при дальнейшем использовании будут проблемы. Но можно использовать если проект "окончательный" и никогда никуда не будет встроен. Ибо разобраться в получившемся аде будет сложновато Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Не вижу смысла в ваших действиях... Приведи пример пожалуйста, для чего это может пригодиться? Чего нельзя сделать стандартными и понятными любому средствами Qt?
Этот пример и был приведен в первом посте темы. Возможно Вас смутило незнакомое API, и Вы не поняли о чем речь (что впрочем не помешало Вам принять активное участие в обсуждении Улыбающийся). Ладно, попробую объяснить проще. Есть старое (не Qt) приложение использующее такую технику
Код
C++ (Qt)
DrawSomething( Window * );   // нарисовать что-то в окне (с выводом на экран)
DoSomethingLong();            // какие-то длинные вычисления
 
Если у Вас есть предложения как сделать это "стандартными и понятными любому средствами Qt" - я их с удовольствием выслушаю. Если в очередной раз "рисуем на pixMap" - то сначала подумайте сами (хоть немного) во что это вольется.
Записан
Bepec
Гость
« Ответ #38 : Декабрь 24, 2013, 17:57 »

Понял что вы не читаете мои сообщения Веселый

PS если дочитали до сюда, ещё раз объясните чем рисование на системном фоне отличается от рисования на несистемном фоне pixmap в Windows?

Ваше первое сообщение уже давно "решено". В OSX так нельзя. В windows можно. Зачем лезть фиг знает куда?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Есть старое (не Qt) приложение использующее такую технику
Теперь новое приложение что-то выведет на экран и пойдет что-то считать. В этот момент пользователь свернет/развернет окно этого приложения или переключится на другое окно - получим окно с артефактами.
Все что выводилось на экран "во всех местах" нужно сохранять, что бы потом штатно это рисовать в paintEvent.

Сейчас тот самый момент, когда "старую технику" нужно заменить новой. Улыбающийся

« Последнее редактирование: Декабрь 24, 2013, 18:12 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

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

1) Просто-напросто перерисовать контрол(ы). Это связано с тем что используется старый синхронный подход
Код
C++ (Qt)
while (MouseDown()) {
 // здесь напр EditText должен показать новое значение
}
Он берет контекст и просто вызывает paint контрола сам. Да, в Вындоуз это решается через repaint, но решения для OSX я не нашел. А переделать все драги на событийную схему - нереально пока под Qt вообще не ходит

2) Подсветить что-то. Напр юзверь попал в айтем. Опять взял контекст, отрисовал напрямую именно этот айтем и обвел его рамочкой. Юзверь отпустил мышь - ну сделал inval(), пришел штатный paint, что айтем выбран он понимает, а о рамочке ничего не знает - ну так она и не нужна, мышь-то уже отпущена.

Перекрытие окна само по себе не опасно, т.к. double-buffer. А событие paint не придет пока не отдал управление. Все бычит.

ещё раз объясните чем рисование на системном фоне отличается от рисования на несистемном фоне pixmap в Windows?
Объяснить не могу т.к. без понятия что то за системный/несистемный фоны Непонимающий Поверьте, все Ваши сообщения я прочитал и пытался рассматривать их конструктивно - но пока без особого успеха Улыбающийся Прикрепляю маленький скриншот дабы показать что требуется   

Записан
Bepec
Гость
« Ответ #41 : Декабрь 24, 2013, 20:44 »

Кхм. Я вас главное понял. Вопрос закрываем.

А конечная точка - да, на OSX решайте костылями.
На windows переписывайте нормально, с помощью paintEvent.

В OSX это неизбежное зло(как вывод этой темы), а в windows всё это просто реализуемо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

... а в windows всё это просто реализуемо.
Тогда я попрошу Вас ответить за свои слова: воспроизведите скриншот из моего предыдущего поста - в принципе конечно, "пиксель в пиксель" не требуется
Записан
Bepec
Гость
« Ответ #43 : Декабрь 25, 2013, 10:33 »

Задачу приведите. Полную. Типа "чтобы рисовалась надпись в любой момент в нужном месте окна при нажатии мышкой".

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

Сообщений: 11445


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

Задачу приведите. Полную. Типа "чтобы рисовалась надпись в любой момент в нужном месте окна при нажатии мышкой".
Нормальная формулировка, только "нужное место" включает и занятое контролами (см скриншот). Платформа Вындоуз. Жду Вашего кода. Спасибо.
Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


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