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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте  (Прочитано 14102 раз)
AAXEE
Гость
« : Ноябрь 29, 2008, 21:45 »

С рисованием с помощью QGraphicsItem я разобрался.
Пытался рисовать QPainterом.
В paintEvent получается рисовать примитивы(линии, квадраты, эллипсы ), но дальше не понимаю.
Вот вопрос, ответ на который должен прояснить для меня ситуацию.

Как сделать два слота, так чтобы при срабатывании первого на моем виджете рисовался круг, а при срабатывании второго квадрат? И соответственно каким должен быть paintEvent

Все непонимание, в сущности, заключается в том, что непонятно когда вызывается paintEvent.
И он ведь один(метод для рисования чего-то)! А если надо разные вещи рисовать?
Помогите пожалуйста, столько времени уже ковыряюсь, и все без толку. Я в отчаянии.

Спасибо!
Записан
ритт
Гость
« Ответ #1 : Ноябрь 29, 2008, 22:19 »

попробуй вот так:
Код:
class MyWidget : public QWidget
{
Q_OBJECT

public:
MyWidget(QWidget* parent = 0) : QWidget(parent),
m_drawRect(false),
m_drawCircle(false)
{
}

public slots:
void drawRect()
{
m_drawRect = true;
update();
}
void drawCircle()
{
m_drawCircle = true;
update();
}

protected:
void paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);

QPainter painter(this);
painter.setPen(Qt::darkGray);
painter.setBrush(Qt::darkGray);

if(m_drawRect)
painter.drawEllipse(rect());
if(m_drawCircle)
painter.drawEllipse(rect());
}

private:
bool m_drawRect;
bool m_drawCircle;
};
если этот код понятен, особых проблем впредь быть не должно...

код вбивал прямо в браузере - не исключены баги Улыбающийся
Записан
AAXEE
Гость
« Ответ #2 : Ноябрь 29, 2008, 22:41 »

Большое спасибо!
В целом код понятен.
Возникло несколько небольших вопросов, но, думаю, я сам на них ответы найду.
Сегодня проверять-компилировать уже не смогу, ибо спать...
Завтра отпишусь.
PS: Я правильно понимаю, что это такой стандартный способ рисования с QPainter, когда необходима реакция на действия пользователя?

И да, еще раз спасибо! Я прям рад!
Записан
ритт
Гость
« Ответ #3 : Ноябрь 30, 2008, 00:31 »

> Я правильно понимаю, что это такой стандартный способ рисования с QPainter, когда необходима реакция на действия пользователя?

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

удачного изучения. ветку переношу в "вопросы нвичков"
Записан
AAXEE
Гость
« Ответ #4 : Ноябрь 30, 2008, 17:30 »

Код работает.

Но все равно мне непонятно зачем такие извращения.
Объекты были придуманы для облегчения труда.
В данном случае только усложнение. Объекты ради объектов, а не ради программиста.

Буду считать, что я еще не осознал эту философию, и писать дальше - ничего не поделаешь.

В любом случае благодарен.
Записан
Rcus
Гость
« Ответ #5 : Ноябрь 30, 2008, 18:03 »

Классы это инструмент борьбы со сложностью. Возможно вы не видите сложности в создании кроссплатформенного интерфейса (не только графического), но все же Qt работает под 3 совершенно разными семействами операционных систем. В данном случае QPainter обеспечивает высокоуровневую абстракцию над конкретными реализациями систем вывода графики (судя по assistant есть по крайней мере 13 реализаций QPaintEngine, и можно добавлять свои)
Записан
AAXEE
Гость
« Ответ #6 : Ноябрь 30, 2008, 18:15 »

Хорошо, понятно.
А скажите, принципиально возможно самому написать билдеровский Canvas с помощью QPainter? И использовать так как более понятно.
Записан
ритт
Гость
« Ответ #7 : Ноябрь 30, 2008, 23:03 »

если очень хочется, то можно.
вот только нафига? спасибо никто всё-равно не скажет, да и сам со временем увидишь, что это не нужно...

кстати, фактически канва делфи - это битмап (пиксмап в наше случае) определённого размера...откуда вытекает необходимость в двойной буфферизации и множество неудобств, связанных с рисованием на этом пиксмапе. в итоге же этот пикмап всё-равно придётся отрисовывать через пеинтнджине кут - купинтер.
« Последнее редактирование: Ноябрь 30, 2008, 23:29 от Константин » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #8 : Декабрь 01, 2008, 13:20 »

Хорошо, понятно.
А скажите, принципиально возможно самому написать билдеровский Canvas с помощью QPainter? И использовать так как более понятно.
Лучшим выходом будет постичь логику программирования GUI в целом.
А логика в том, что GUI-программирование построено на событийной модели.
Windows/GM(KDE например) посылает сигналы, например: прорисуй окно: и ты должен рисовать, окно меняет размер: ты реагируешь; мыша сработала: ты реагируешь.
Логика отрисовки требует, что-бы ты подготовил данные в удобной для отрисовки до сигнала paintEvent. Как ты будешь их готовить, твое дело, хоть в канвасе, хоть в пиксмепе, хоть еще как-то..
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


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

ветку переношу в "вопросы новичков"
Зачем?
Осознание новых технологий - это циклический процесс в жизни любого специалиста.
Тут нет четких градаций: новичек-спец-гуру. Это число субъективная оценка,
она зависит только от уровня оценщика.
пожалуйста не надо так делать. Кроме психологического дискомфорта такие действия ничего не дадут.
« Последнее редактирование: Декабрь 01, 2008, 13:26 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Volder
Гость
« Ответ #10 : Январь 27, 2009, 03:23 »

А скажите пожалуста как, к примеру, нам сохронить место положения круга.  Ми нарисовали один круг а потом ищо оди
что нужни сделать штоби ми имели 2 или больше кругов
Записан
BRE
Гость
« Ответ #11 : Январь 27, 2009, 08:53 »

Можно пойти несколькими путями, например:
* Все функции рисования рисуют во внутренний буфер, paintEvent только рисует этот буфер на виджет. В этом случае по буферу невозможно узнать, какой объект где нарисован, переместить его и т.д. (без дополнительных телодвижений).
* Функции рисования не рисуют объекты, а добовляют их в коллекцию, а функция paintEvent берет и из коллекции и рисует на виджет. В этом случае можно определить сколько объектов на сцене, модифицировать их как угодно. (получаем примитивный QGraphicsScene+QGraphicsView).
« Последнее редактирование: Апрель 15, 2010, 17:44 от BRE » Записан
kpx13
Гость
« Ответ #12 : Апрель 15, 2010, 17:37 »

А как сделать этот буфер???
Записан
BRE
Гость
« Ответ #13 : Апрель 15, 2010, 17:45 »

А как сделать этот буфер???
Этим буфером может быть QPixmap/QImage.
Записан
kpx13
Гость
« Ответ #14 : Апрель 15, 2010, 17:49 »

Но у меня не получается (
Напишите, пожалуйста, как загружать и выгружать изображение из QPixmap и обратно!
И где по рисованию инфу найти? Я ничего дельного не нашла пока( Хотя у меня 3 книжки по Qt.

И что за методы такие у QPainter save и restore?
И чем отличаются QPixmap и QImage?
« Последнее редактирование: Апрель 15, 2010, 17:57 от kpx13 » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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