crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Рисование в Qt
greh
  опции профиля:
сообщение 23.11.2009, 16:42
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток. Помогите разобраться с рисованием в Qt.

Вот класс отвечающий за виджет на котором рисуются фигуры:

paintarea.h:

CODE
#ifndef PAINTAREA_H
#define PAINTAREA_H

#include <QWidget>
#include <QBrush>
#include <QPen>

class PaintArea: public QWidget
{
Q_OBJECT

public:
PaintArea(/*QWidget *parent = 0*/); //for what?
void paintEvent(/*QPaintEvent *event*/); //for what?

public slots:
void Paint();
};


#endif // PAINTAREA_H


paintarea.cpp:

CODE
#include "paintarea.h"

PaintArea::PaintArea()
{
setFixedSize(500,500);
}

void PaintArea::Paint()
{
update();
}

void PaintArea::paintEvent(/*QPaintEvent **/) //for what?
{
QRect rect(10,20,30,40);

QPainter painter(this);//paintarea.cpp:17: error: variable ‘QPainter painter’ has initializer but incomplete type

painter.setRenderHint(QPainter::Antialiasing,true);
painter.setPen(QPen(Qt::black,10));
painter.setBrush(QBrush(Qt::green));

painter.drawRect(rect);


}


Стянуто это безобразие из примеров, однако даже не компилируется. И объясните пожалуйста для чего нужны параметры которые я закоментировал? Заранее спасибо.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.11.2009, 16:50
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


по поводу первого parent, смотри "Деревья объектов и владение объектами" (к сожалению ещё не переведено). Ну и описание конструктора класса QWidget:
Цитата
QWidget::QWidget ( QWidget * parent = 0, Qt::WindowFlags f = 0 )

Constructs a widget which is a child of parent, with widget flags set to f.

If parent is 0, the new widget becomes a window. If parent is another widget, this widget becomes a child window inside parent. The new widget is deleted when its parent is deleted.


Ну, а по поводу второго, можно посмотреть описание класса QPaintEvent
Цитата(greh @ 23.11.2009, 19:42) *
Стянуто это безобразие из примеров, однако даже не компилируется.
Стало быть стянуто плохо, во-первых раскомментируй то, что ты закомментировал. Во-вторых, добавь недостающие inlude
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
greh
  опции профиля:
сообщение 23.11.2009, 17:04
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 23.11.2009, 18:50) *
...

Спасибо! Скомпилировалось и нарсовалось. Только вот проблемка осталась... Как заставить его рисовать только тогда когдя я нажимаю кнопку(слот Paint() ) и как же всётаки работает event (ну хоть в кратце).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
greh
  опции профиля:
сообщение 23.11.2009, 18:39
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


А всё придумал, по умолчанию rect(0,0,0,0) сделать. На самом деле проблема была из за того что написал void PaintEvent(QPaintEvent *); за место paintEvent(QPaintEvent *); спасибо за помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.11.2009, 18:50
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(greh @ 23.11.2009, 20:04) *
как же всётаки работает event
ОСь шлёт событие, у виджета вызывается соответсвующий данному типу события обработчик - функция содержащая в своём имени слово "event". Например, когда ОСь посылает событие "А ну перерисуйся" вызывается метод paintEvent.

Цитата(greh @ 23.11.2009, 20:04) *
Как заставить его рисовать только тогда когдя я нажимаю кнопку(слот Paint() )
не перерисовывать виджет в обработчике paintEvent, если не была нажата кнопка, например ввести флаг-член_класса
В слоте его выставлять, а в paintEvent'е проверять, после перерисовки сбрасывать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mettamo
  опции профиля:
сообщение 17.12.2009, 20:46
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 22.10.2009
Пользователь №: 1173

Спасибо сказали: 0 раз(а)




Репутация:   0  


void MainWindow::paintEvent(QPaintEvent *)
{
if (!ui->ButtonBuild->isChecked())
{ QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
}

как рисовать по нажатию кнопки и при этом не стирать предыдущий рисунок?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.12.2009, 22:24
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(mettamo @ 17.12.2009, 23:46) *
как рисовать по нажатию кнопки и при этом не стирать предыдущий рисунок?
например, такой вариант:
рисуешь в слоте-обработчике кнопки на QImage.
А в обработчике события рисования (paintEvent) рисуешь на виджете этот QImage
в качестве примера смотри %QTDIR%\examples\widgets\scribble\scribblearea.cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 18.12.2009, 11:56
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Цитата(mettamo @ 17.12.2009, 19:20) *
Вообщем я пытаюсь рисовать на виджите

void MainWindow::paintEvent(QPaintEvent *)
{
    ev->
    ui->ButtonBuild->isChecked()
     QPainter painter(this);
     painter.setPen(Qt::blue);
     painter.setFont(QFont("Arial", 30));
     painter.drawText(rect(), Qt::AlignCenter, "Qt");
    
  
}


как сделать чтоб он рисовал по нажатию кнопки а не при запуске программы?

Я все же попробую ответить, хотя Юрий будет на меня ругаться:)
paintEvent вызывается на виджете каждый раз, когда происходит событие отрисовки. Он вызывается что бы перерисовать весь или часть виджета.
Цитата
A paint event is a request to repaint all or part of a widget. It can happen for one of the following reasons:

repaint() or update() was invoked,
the widget was obscured and has now been uncovered, or
many other reasons.

Проще говоря, когда ты мышкой по своим контролам водишь - он вызывается. когда изменяет размер, положение виджета, когда сворачиваешь и разворачиваешь его.. А не только при запуске программы. тебе надо определить слот для сигнала своей кнопки, в котором ты будешь рисовать на виджете QPainter'ом...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 18.12.2009, 13:29
Сообщение #9


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Andrewshkovskii @ 18.12.2009, 11:56) *
А не только при запуске программы. тебе надо определить слот для сигнала своей кнопки, в котором ты будешь рисовать на виджете QPainter'ом...

а примерчик можно?
по-моему не получится
рисовать на виджете можно только в paintEvent(), исключаяя оверпеинтинг.
в слоте реагирующем на нажатия кнопки можно определить к примеру флаги или параметры и вызывать update() или repaint() а в последующем paintEvent() обрабатывать флаги ли параметры.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.12.2009, 17:26
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kwisp @ 18.12.2009, 16:29) *
рисовать на виджете можно только в paintEvent(), исключаяя оверпеинтинг.
именно

ещё, довольно часто стал сталкиваться, используют практику упомянутую в сообщении № 7
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 9.12.2019, 16:47