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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рисование по QWidget в Линукс  (Прочитано 4784 раз)
s-s-n
Гость
« : Май 20, 2014, 19:25 »

Доброго всем времени суток...

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

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

Есть ли аналоги функций в библиотеке Qt?
Или здесь будет другой порядок действий?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Май 20, 2014, 19:36 »

За основу взять QPainter и рисовать всё что нужно внутри QWidget::paintEvent()
Записан
s-s-n
Гость
« Ответ #2 : Май 21, 2014, 08:00 »

За основу взять QPainter и рисовать всё что нужно внутри QWidget::paintEvent()
Это если реализовывать свой класс и в нем рисовать. Вроде можно рисовать и вне виджета...
А как на счет аналогов приведенных функций...

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

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Май 21, 2014, 08:05 »

Это если реализовывать свой класс и в нем рисовать. Вроде можно рисовать и вне виджета...
А как на счет аналогов приведенных функций...
Все это решается с помощью QPainter и QImage.
Записан
s-s-n
Гость
« Ответ #4 : Май 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();
Записан
Bepec
Гость
« Ответ #5 : Май 21, 2014, 11:59 »

Да, как то так.
То, что вы привели, относится к WinApi.

А Qt даёт универсальный кросс-платформенный интерфейс.
Записан
s-s-n
Гость
« Ответ #6 : Май 21, 2014, 13:44 »

Да, как то так.
То, что вы привели, относится к WinApi.

А Qt даёт универсальный кросс-платформенный интерфейс.
Каким образом можно произвести эти действия:
GetDC();
CreateCompatibleDC();
GetWindowRect();
CreateCompatibleBitmap();
ReleaseDC()
SelectObject();
при помощи Qt?
ну или достигнуть тот же результат...
Записан
Bepec
Гость
« Ответ #7 : Май 21, 2014, 14:14 »

А вы опишите что вы хотите в результате получить.

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

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

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

PS Рисуется так
Код:
QPainter painter(this);
painter.drawLine(0,0,100,100);
Записан
s-s-n
Гость
« Ответ #8 : Май 21, 2014, 17:09 »

А вы опишите что вы хотите в результате получить.


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

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

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

Что надо брать в качестве контекста?
Возможно ли рисовать вне виджета?
Обязательна реализация своего класса или нет?
Записан
Bepec
Гость
« Ответ #9 : Май 21, 2014, 18:42 »

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

PS я бы на вашем месте пересмотрел архитектуру вашей программы. Как показывает практика 50% "возможностей рисования вне виджета" не нужны.
Записан
s-s-n
Гость
« Ответ #10 : Май 21, 2014, 18:55 »

PS я бы на вашем месте пересмотрел архитектуру вашей программы. Как показывает практика 50% "возможностей рисования вне виджета" не нужны.
Спасибо.
Буду экспериментировать.
Архитектура задана жестко, менять ее нельзя...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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