Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: s-s-n от Май 20, 2014, 19:25



Название: Рисование по QWidget в Линукс
Отправлено: s-s-n от Май 20, 2014, 19:25
Доброго всем времени суток...

Надо реализовать рисование по QWidget.
Что взять за основу?

В Windows, как я понял, подобная задача решается с помощью:
GetDC();
CreateCompatibleDC();
GetWindowRect();
CreateCompatibleBitmap();
ReleaseDC()
SelectObject();

Есть ли аналоги функций в библиотеке Qt?
Или здесь будет другой порядок действий?


Название: Re: Рисование по QWidget в Линукс
Отправлено: Alex Custov от Май 20, 2014, 19:36
За основу взять QPainter и рисовать всё что нужно внутри QWidget::paintEvent()


Название: Re: Рисование по QWidget в Линукс
Отправлено: s-s-n от Май 21, 2014, 08:00
За основу взять QPainter и рисовать всё что нужно внутри QWidget::paintEvent()
Это если реализовывать свой класс и в нем рисовать. Вроде можно рисовать и вне виджета...
А как на счет аналогов приведенных функций...



Название: Re: Рисование по QWidget в Линукс
Отправлено: Old от Май 21, 2014, 08:05
Это если реализовывать свой класс и в нем рисовать. Вроде можно рисовать и вне виджета...
А как на счет аналогов приведенных функций...
Все это решается с помощью QPainter и QImage.


Название: Re: Рисование по QWidget в Линукс
Отправлено: s-s-n от Май 21, 2014, 09:34
Это если реализовывать свой класс и в нем рисовать. Вроде можно рисовать и вне виджета...
А как на счет аналогов приведенных функций...
Все это решается с помощью QPainter и QImage.

Как то так:
QImage image;
QPainter p;
p.begin(&image);
p.drawLine(0,0, 100, 100);
p.fillRect(200, 200, 50, 50, Qt::green);
p.end();


Название: Re: Рисование по QWidget в Линукс
Отправлено: Bepec от Май 21, 2014, 11:59
Да, как то так.
То, что вы привели, относится к WinApi.

А Qt даёт универсальный кросс-платформенный интерфейс.


Название: Re: Рисование по QWidget в Линукс
Отправлено: s-s-n от Май 21, 2014, 13:44
Да, как то так.
То, что вы привели, относится к WinApi.

А Qt даёт универсальный кросс-платформенный интерфейс.
Каким образом можно произвести эти действия:
GetDC();
CreateCompatibleDC();
GetWindowRect();
CreateCompatibleBitmap();
ReleaseDC()
SelectObject();
при помощи Qt?
ну или достигнуть тот же результат...


Название: Re: Рисование по QWidget в Линукс
Отправлено: Bepec от Май 21, 2014, 14:14
А вы опишите что вы хотите в результате получить.

А то получается как то так:

молоток
рука
шуруп
череп

Как можно сделать это же дрелью?

PS Рисуется так
Код:
QPainter painter(this);
painter.drawLine(0,0,100,100);


Название: Re: Рисование по QWidget в Линукс
Отправлено: s-s-n от Май 21, 2014, 17:09
А вы опишите что вы хотите в результате получить.


Спасибо за внимание к моей проблеме.

QWidget создается динамически.
Далее передается указатель на него
в функцию создания контекста устройства.
Указатель на контекст устройства передается при создании-установке
кисти, шрифта, пера и т.д.

Приведенные Win-функции использовались в примере, там создавался свой класс.
Есть нечто общее.

Что надо брать в качестве контекста?
Возможно ли рисовать вне виджета?
Обязательна реализация своего класса или нет?


Название: Re: Рисование по QWidget в Линукс
Отправлено: Bepec от Май 21, 2014, 18:42
1) Виджет рисует себя сам и только в ф-ции painEvent(QPaintEvent*);
2) Виджет может отрисовывать QPixmap/QImage, которые будут доступны публично.
3) Рисовать вне виджета нельзя. Если есть необходимость - используйте платформозависимые фунции.
4) Ваша проблема решается приблизительно так : Создаётся виджет, отрисовывающий публичный QPixmap. Далее получаем из него QPixmap и рисуем что угодно. После рисования просим виджет перерисовать самого себя.

PS я бы на вашем месте пересмотрел архитектуру вашей программы. Как показывает практика 50% "возможностей рисования вне виджета" не нужны.


Название: Re: Рисование по QWidget в Линукс
Отправлено: s-s-n от Май 21, 2014, 18:55
PS я бы на вашем месте пересмотрел архитектуру вашей программы. Как показывает практика 50% "возможностей рисования вне виджета" не нужны.
Спасибо.
Буду экспериментировать.
Архитектура задана жестко, менять ее нельзя...