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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Graphics View Framework  (Прочитано 13253 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Май 08, 2014, 13:38 »

Хочу закрасить произвольную область при нажатии кнопки мыши.

Код
C++ (Qt)
 
class Item: public QGraphicsItem
{
public:
   Item(QGraphicsItem*parent = 0)
       :QGraphicsItem(parent),down(false){}
 
   QRectF boundingRect() const
   {
       return QRectF(0,0,100,70);
   }
 
   void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
   {
       QPen pen(QBrush(Qt::black),3, Qt::SolidLine);
       painter->setBrush(down ? Qt::red : Qt::green);
       painter->setPen(pen);
 
       painter->drawLine(10,10,200,10);
       painter->drawLine(200,10,200,50);
       painter->drawLine(200,50,50,50);
       painter->drawLine(50,50,50,70);
       painter->drawLine(50,70,100,70);
       painter->drawLine(100,70,100,100);
       painter->drawLine(10,10,10,100);
       painter->drawLine(10,100,100,100);
   }
 
protected:
 
   void mousePressEvent(QGraphicsSceneMouseEvent* event)
   {
       if(!down)
       {
           down = true;
           update();
           qDebug()<<down;
       }
   }
 
   void mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
   {
       if(event->buttons() == 0)
       {
           down = false;
           update();
           qDebug()<<down;
       }
   }
 
private:
   bool down;
};
 
 

Но закраска не происходит, хотя события по нажатию кнопки мыши срабатывают.
Возможно ли закрасить произвольную область???
« Последнее редактирование: Май 08, 2014, 13:40 от demaker » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


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

Заливку области надо делать через fillRect(boundingRect(), QBrush(Qt::red)).
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


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

Да и каккую же область он мне закрасит???
Код:
boundingRect();
А не которую я линиями нарисовал.
Разве нет???
Записан
Bepec
Гость
« Ответ #3 : Май 08, 2014, 14:17 »

Вы чего хотите?  Закрасить произвольную область за пределами объекта ? Так он и закрасит. А перед этим painter clip'ом обрежет до размеров вашего объекта.

Сформулируйте свою хотелку полностью Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



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

Вы чего хотите? 
Судя по единственному заданному вопросу,
Возможно ли закрасить произвольную область???
он хочет ответ да/нет. Мой ответ - да.
Если вопрос всё же "как это сделать?", то мой ответ использовать QPainter::drawPolygon. Только, как совершенно справедливо заметил Верес, в качестве координат рисуемого полигона стоило бы использовать точки внутри видимой области виджета, а не за её пределами.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


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

Да и каккую же область он мне закрасит???
Код:
boundingRect();
А не которую я линиями нарисовал.
Разве нет???
Он закрасит ту область в пределах фигуры, которую вернет boundingRect(), который сам же и определил. В программировании не бывает произвольных областей, любую надо определить.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


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

А вот я сделал так - это правильно???
Код
C++ (Qt)
class Item: public QGraphicsItem
{
public:
   Item(QGraphicsItem*parent = 0)
       :QGraphicsItem(parent),down(false){}
 
   QRectF boundingRect() const
   {
       return QRectF(0,0,300,200);
   }
 
   QPainterPath shape() const
   {
       QPainterPath path;
 
       QPolygon polygon;
       polygon << QPoint(10 ,10)
               << QPoint(200,10)
               << QPoint(200,50)
               << QPoint(100,50)
               << QPoint(100,80)
               << QPoint(150,80)
               << QPoint(150,200)
               << QPoint(10,200)
               << QPoint(10,10);
 
       path.addPolygon(polygon);
       return path;
   }
 
   void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
   {
       QPen pen(QBrush(Qt::black),3, Qt::SolidLine);
       painter->setBrush(down ? Qt::red : Qt::green);
       painter->setPen(pen);
       painter->drawPath(shape());
   }
 
protected:
 
   void mousePressEvent(QGraphicsSceneMouseEvent* event)
   {
       if(!down)
       {
           down = true;
           update();
           qDebug()<<down;
       }
   }
 
   void mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
   {
       if(event->buttons() == 0)
       {
           down = false;
           update();
           qDebug()<<down;
       }
   }
 
private:
   bool down;
};
 
 
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #7 : Май 12, 2014, 10:00 »

Скажите, можно ли таким же образом
взять контур из bmp-файла и закрасить его?
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #8 : Май 12, 2014, 11:26 »

взять контур из bmp-файла
Это как? Контур по определению векторная штука, представляемая набором точек (если состоит только из прямолинейных отрезков). А в bmp только растр.

и закрасить его?
Можно bmp загрузить в QImage, взять матрицу пикселей и самому заполнить нужные, которые как-бы в "контуре".

Вот кстати похожая тема.
« Последнее редактирование: Май 12, 2014, 11:38 от kamre » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #9 : Май 12, 2014, 14:58 »

Хочу в загруженной картинки изменить цвет пиксиля,
координаты которго получаю при нажатии мыши

Код
C++ (Qt)
 
explicit GraphicsScene(QObject*parent = 0): QGraphicsScene(parent)
   {
       addPixmap(QPixmap("D:/Qt/Qt5.2.1/Tools/QtCreator/bin/Graphics/lodka.bmp"));
       sceneImage = new QImage("D:/Qt/Qt5.2.1/Tools/QtCreator/bin/Graphics/lodka.bmp");
   }
 
...
void mousePressEvent(QGraphicsSceneMouseEvent* event)
   {
       qDebug()<<event->scenePos();    //положнеие курсора относительно сцены        
       QPointF scenePoint = event->scenePos();
       sceneImage->setPixel( (int)(scenePoint.x()), (int)(scenePoint.y()) ,???);      
   }
 

Пытаюсь сделать с помощью функции
Код:
void QImage::setPixel ( int x, int y, uint index_or_rgb )This is an overloaded function.
Sets the pixel index or color at (x, y) to index_or_rgb.

но эффекта никакого.

Подскажите как сделать???


Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #10 : Май 13, 2014, 09:02 »

А сцена в курсе, что её изменили и надо перерисоваться?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #11 : Май 13, 2014, 09:40 »

это типа
Код:
update()
сделать???

Подскажите конкретнее пожалуйста
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #12 : Май 13, 2014, 10:09 »

это типа update() сделать???
Вроде того.

Подскажите конкретнее пожалуйста
Я же не знаю, что именно потом у Вас со sceneImage делается.
По коду из конструктора сцены я не могу этого понять. Кто и где у Вас sceneImage на экран выводит-то?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #13 : Май 13, 2014, 10:12 »

Спасибо всем, разобрался.
Код
C++ (Qt)
class GraphicsScene: public QGraphicsScene
{
   Q_OBJECT
 
public:
 
   explicit GraphicsScene(QObject*parent = 0): QGraphicsScene(parent)
   {
       sceneImage = new QImage("D:/Qt/Qt5.2.1/Tools/QtCreator/bin/Graphics/lodka.bmp");
       QPixmap pixmap;
       addPixmap(pixmap.fromImage(*sceneImage));
   }
 
   virtual ~GraphicsScene()
   {
       delete sceneImage;
   }
 
protected:
   void mousePressEvent(QGraphicsSceneMouseEvent* event)
   {
       qDebug()<<event->scenePos();    //положнеие курсора относительно сцены
       QPointF scenePoint = event->scenePos();
       sceneImage->setPixel( (int)(scenePoint.x()), (int)(scenePoint.y()) ,155);
       QPixmap pixmap;
       addPixmap(pixmap.fromImage(*sceneImage));
    }
 
private:
   QImage *sceneImage;
};
 
 

Но почему так сложно.
Т.е я беру каждый раз и перезагружаю изображение.
А проще нельзя???
« Последнее редактирование: Май 13, 2014, 10:47 от demaker » Записан
Bepec
Гость
« Ответ #14 : Май 13, 2014, 11:44 »

Можно. Но это будет сложнее Веселый Можно перегружать только изменившуюся часть и её же только отрисовывать Улыбающийся
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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