Russian Qt Forum
Июля 07, 2025, 01:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Января 13, 2014, 12:12 »

Можно и просто через QPixmap::grabWindow (работает и для окон с OpenGL). Ну а дальше-то что? Напр нужно провести хоr-линию, не буду же я выцарапывать и инвертировать по пикселю  Плачущий  Остается скопировать все содержимое в верхнее, ну как бы покрыть окно его же копией и там уже xor-ить. Но тогда придется следить за изменением нижнего - не кайф
Почему обязательно через XOR и QRubberBand?
Разве свой rubber-band сложно сделать? Например, типа затемнённой заливки?
При изменениях области через QPixmap::grabWindow() захватываешь соответствующую область с основного окна, заливаешь полученный пиксмап через drawRect() полупрозрачным QBrush и непрозрачным QPen и уже этот пиксмап отрисовываешь на верхнем окне.

Насчёт слежения за изменениями нижнего...
А нужно ли?
Ведь показывать верхнее окно следует только по нажатию кнопкой мыши.
Думаю ничего страшного не произойдёт, если картинка замрёт.

Не вижу проблемы)

Кстати, судя по описанию QPixmap::grabWindow():
Цитировать
The grabWindow() function grabs pixels from the screen, not from the window, i.e. if there is another window partially or entirely over the one you grab, you get pixels from the overlying window, too. The mouse cursor is generally not grabbed.
использовать его в данном случае не получится.
У себя я добирался непосредственно до double-buffer так:
Код
C++ (Qt)
#include <private/qwindowsurface_p.h>
 
if( QPaintDevice* pdev = top_level->windowSurface()->paintDevice() )
{
if( QPixmap* pix = dynamic_cast< QPixmap* >( pdev ) )
{
...
}
else if( QImage* img = dynamic_cast< QImage* >( pdev ) )
{
...
}
}
 
« Последнее редактирование: Января 13, 2014, 12:39 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Января 13, 2014, 13:24 »

Кстати, судя по описанию QPixmap::grabWindow():
...
использовать его в данном случае не получится.
Получается. Создаваемое окно имеет те же флаги что и нижнее. Если нижнее было перекрыто каким-то окном (напр палеткой) то верхнее/созданное также будет перекрыто

У себя я добирался непосредственно до double-buffer так:
Это не работает с нативным double-buffer там device не QImage/QPiхmap а нативный контекст 

Почему обязательно через XOR и QRubberBand?
Разве свой rubber-band сложно сделать? Например, типа затемнённой заливки?
При изменениях области через QPixmap::grabWindow() захватываешь соответствующую область с основного окна, заливаешь полученный пиксмап через drawRect() полупрозрачным QBrush и непрозрачным QPen и уже этот пиксмап отрисовываешь на верхнем окне.

Насчёт слежения за изменениями нижнего...
А нужно ли?
Ведь показывать верхнее окно следует только по нажатию кнопкой мыши.
Думаю ничего страшного не произойдёт, если картинка замрёт.

Не вижу проблемы)
Да, все работает. Но хотелось бы обойтись чисто композитом, без копирования содержимого. К сожалению не вижу как разрулить XOR, а без него сложно  Плачущий
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #17 : Января 13, 2014, 13:35 »

Это не работает с нативным double-buffer там device не QImage/QPiхmap а нативный контекст 
Хм... Странно, по исходникам этого не скажешь.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Января 13, 2014, 14:05 »

Можно и без приватного хедера
Код
C++ (Qt)
#include <QtWidgets>
 
class MyDialog : public QDialog {
public:
 
void paintEvent( QPaintEvent * )
{
QPainter p(this);
QPaintDevice * pdev = p.paintEngine()->paintDevice();
QImage * img = dynamic_cast<QImage *> (pdev);
QPixmap * pix = dynamic_cast<QPixmap *> (pdev);
qDebug() << pdev << img << pix;
}
};
 
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyDialog().exec();
return 0;
}
На Вындоуз имеем QImage, на OSX 2 нуля
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #19 : Января 13, 2014, 22:30 »

а если создавать по нажатию мыша окно и заливать его кистью с цветом Qt::transparent? и рамочку потом поверху?
не знаю, будет ли на маке работать, но по идее должно.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Января 14, 2014, 05:51 »

а если создавать по нажатию мыша окно и заливать его кистью с цветом Qt::transparent? и рамочку потом поверху?
не знаю, будет ли на маке работать, но по идее должно.
Так же и делаю. Вместо заливки проще WA_TranslucentBackground. Еще нужно пресечь смену фокуса и убрать тень (см обсуждение выше). К сожалению, не нашел элегантного способа XOR-ить это окно с тем что под ним
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Января 14, 2014, 07:27 »

К сожалению, не нашел элегантного способа XOR-ить это окно с тем что под ним
Почему вы так хотите xor-ить содержимое? В восмедисятых-девяностых 20 века - ну ладно, сейчас 21 век... Улыбающийся

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

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Января 14, 2014, 08:56 »

Почему вы так хотите xor-ить содержимое? В восмедисятых-девяностых 20 века - ну ладно, сейчас 21 век... Улыбающийся
С удовольствием бы от него избавился, но что взамен? Предлагайте. Какой-то цвет (напр красный) - так его надо задавать в преференсах. Плюс лезть во все драги и переписать логику инверсии (не смертельный, но неприятный пробег по чужому коду).

[/offtop]
"восьмидесятых"  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #23 : Января 14, 2014, 09:17 »

Цвет лучше выбрать фиолетовый, он круче красного.

Скажите, а сейчас вам не надо пробегаться по всем местам чужих исходников?

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

Отвечаю без цитат, пока могу писать (обратите внимание, ударение на второй слог) только с телефона.
« Последнее редактирование: Января 14, 2014, 09:36 от Old » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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