Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Января 22, 2014, 13:31



Название: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Igors от Января 22, 2014, 13:31
Добрый день

Как мне в момент рисования прочитать пиксель(и)? Не наблюдаю такого метода у QPainter. Please "ткните носиком".

И, чтобы не плодить однотипные темы, то же со скроллом (опять в момент рисования).
Обе ф-ции всю жизнь были в нативном рисовании. Чем их заменить при переходе на Qt?

Спасибо


Название: Re: QPainter::getPixel() ?
Отправлено: Old от Января 22, 2014, 14:19
Добрый день

Как мне в момент рисования прочитать пиксель(и)? Не наблюдаю такого метода у QPainter. Please "ткните носиком"

Спасибо
В качестве бэкенда для рисования может использоваться OpenGL, поэтому через QPainter скорее всего никак.
Но можно попробовать добраться до backbuffer.


Название: Re: QPainter::getPixel() ?
Отправлено: GreatSnake от Января 22, 2014, 14:31
Как мне в момент рисования прочитать пиксель(и)? Не наблюдаю такого метода у QPainter. Please "ткните носиком"
Собственно, а почему он должен быть?

В качестве бэкенда для рисования может использоваться OpenGL, поэтому через QPainter скорее всего никак.
А может и QPrinter. Вот будет интересно спросить у принтера пиксель :)


Название: Re: QPainter::getPixel() ?
Отправлено: Igors от Января 22, 2014, 16:42
А может и QPrinter. Вот будет интересно спросить у принтера пиксель :)
А что здесь плохого? В нативняке напр
Цитировать
COLORREF GetPixel(
  _In_  HDC hdc,
  _In_  int nXPos,
  _In_  int nYPos
);
Ну вернет какое-то дефаулт значение если контекст не поддерживает чтение, но операция-то есть

Собственно, а почему он должен быть?
Потому что потребность в нем совершенно естественна. Напр я хочу как-то по-своему подсветить/затемнить участок рисуемого изображения, почему я должен изыскивать подходящий blend или городить свой буфер?   

Ну вот, опять придется нырять в нативняк  :'(


Название: Re: QPainter::getPixel() ?
Отправлено: Bepec от Января 22, 2014, 17:22
Чтобы узнать пиксель, нужно обратиться к холсту, а не кисти. Pixmap, нативняк - вот куда  надо смотреть.


Название: Re: QPainter::getPixel() ?
Отправлено: Igors от Января 22, 2014, 17:52
Чтобы узнать пиксель, нужно обратиться к холсту, а не кисти. Pixmap, нативняк - вот куда  надо смотреть.
"Холст/кисть" - такие термины хороши чтобы начинающий побыстрее понял о чем речь. Но в разговоре профессионалов они неуместны  :)


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Igors от Января 22, 2014, 18:06
Скролла тоже не видно (чтобы не обидеть QPrinter). Или я не прав?


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Old от Января 22, 2014, 18:10
Скролла тоже не видно (чтобы не обидеть QPrinter). Или я не прав?
Скролла это кто?


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Igors от Января 22, 2014, 18:34
Скролла это кто?
Код:
- На Крупской выходите?
- да не Крупской, а Крупского, там еще и памятник ему стоит
Я хоть и небольшой охотник до UI, но уж базовые-то ф-ции помню. А Вы, батенька, что-то вообще поплыли  :'(


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Bepec от Января 22, 2014, 18:40
offtop: Тот является профессионалом, кто может простыми словами сказать о сложном, а не тот, кто говорит сложное о простом.

Скролла и быть не может (если вы о скроллинге). Ведь есть холст и кисть. А холстом является в момент отрисоки только то, что видно.


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Old от Января 22, 2014, 18:46
Я хоть и небольшой охотник до UI, но уж базовые-то ф-ции помню.
Или на ходу придумываете? :)

Я так понимаю, что дальше вы будете искать drawTeapot, сэкономлю вам время - ее тоже нет.


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Igors от Января 22, 2014, 20:00
Скролла и быть не может (если вы о скроллинге). Ведь есть холст и кисть. А холстом является в момент отрисоки только то, что видно.
Поверьте, и то что не видно - тоже. Есть окно, мне известно что обновилось напр 10% пыкселей снизу. Чего же это я не могу сдвинуть вверх 90% и дорисовать только новые 10%? Зачем громко заявлять "быть не может" если вещь банальна/стандартна?  :)

Или на ходу придумываете? :)
Да неужели? См QWidget::scroll который сводится к scroll_sys что использует нативные вызовы скролла. В общем, понял, спрашиваю у больного здоровье  :'(


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: kamre от Января 22, 2014, 20:02
Как мне в момент рисования прочитать пиксель(и)?
В момент рисования через public API скорее всего никак, а вообще через QWidget::grab (http://qt-project.org/doc/qt-5/qwidget.html#grab).

И, чтобы не плодить однотипные темы, то же со скроллом (опять в момент рисования).
Это также вряд ли можно через public API, а для прокрутки есть QWidget::scroll (http://qt-project.org/doc/qt-5/qwidget.html#scroll).

Обе ф-ции всю жизнь были в нативном рисовании. Чем их заменить при переходе на Qt?
В Qt другая идеология же: все через события делать, вот в них и можно вызывать те самые функции, что приведены выше. QPainter API может рисовать через OpenGL, а чтение пикселей обратно из видеопамяти - операция слишком медленная.


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Old от Января 22, 2014, 20:14
Да неужели? См QWidget::scroll который сводится к scroll_sys что использует нативные вызовы скролла.
А как в вашем воображении соотносятся QWidget и QPainter? :)

В общем, понял, спрашиваю у больного здоровье  :'(
Чего? Спрашиваете у здоровья? Больного?  ::)
Отойдите на время от компьютера, вы и так с ним не очень ладите, а сейчас он вас явно уделал. :)


Название: Re: QPainter::getPixel()? QPainter::scroll()?
Отправлено: Igors от Января 22, 2014, 21:19
В Qt другая идеология же: все через события делать, вот в них и можно вызывать те самые функции, что приведены выше. QPainter API может рисовать через OpenGL,
Я понимаю что эти операции не общие, найдется устройство которое их не поддерживает. Но с др стороны - вот QPainter рисует окно Вындоуз, вывод буферирован QImage, Чтение пикселей - на раз, скролл тоже, банальное memmove. Ладно, вот на OSX нативный контекст вместо QImage, но там это еще легче т.к. есть вызовы OC. Понятно разработчику хочется иметь все общее, но все-таки нехорошо так обрезать  :'(

..а чтение пикселей обратно из видеопамяти - операция слишком медленная.
Эх, а раньше, не мудрствуя лукаво, 0xB800 или переключил порты, и в 0xA000 :) Не думаю что дело в низкой скорости чтения. Я вижу что если OpenGL захватил окно (или его часть) то контекста там не получить - ну как бы он возвращается, но все попытки там читать/писать - эффект нулевой. Почему - хз, возможно это проблемы конкретного ОС или GL фреймворка (очень старого)