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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: paintEvent & QGraphicsScene  (Прочитано 7033 раз)
YaTT
Гость
« : Май 25, 2015, 16:30 »

Здравствуйте,  уважаемые форумчане.
Недавно начала изучать Qt(мес. назад),т.к. дали задание сделать граф редактор.
Рисовать круги и получать их координаты, помещать их в QList.
Круги я нарисовал, добавив QGraphicsView и установив сцену, рисую круги посредством добавления их на сцену как QgraphicsPixmapItem;
Но не могу получить их координаты при перемещении.
т.е. я должен перемещать объект и его координаты должны динамические меняться и показываться в label
например:
круг был в (100,50) и в label показывается (100,50),затем я перемещаю круг,например, на (200,400) и в label тоже должно быть (200,400)
Как решать проблему?

Код
C++ (Qt)
void MainWindow::on_actionName1_triggered()
{
Pixmap = scene ->addPixmap(QPixmap("1.png"));
Pixmap -> setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
Pixmap -> setPos(ui->XspinBox->value(),ui->YspinBox->value());
Pixmap -> setScale(0.4);
ui->label->setText(QString::number(Pixmap->pos().x())+"  "+QString::number(Pixmap->pos().y()));
}
« Последнее редактирование: Май 26, 2015, 19:22 от Ni@ck » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Май 25, 2015, 17:00 »

Попробуйте у сцены ловить сигнал changed
Записан

YaTT
Гость
« Ответ #2 : Май 25, 2015, 18:13 »

Попробуйте у сцены ловить сигнал changed
не могу попробовать, т.к. Qlist ещё не сделан =\
Записан
YaTT
Гость
« Ответ #3 : Май 25, 2015, 18:48 »

Попробуйте у сцены ловить сигнал changed
не могу попробовать, т.к. Qlist ещё не сделан =\
к тому же, в QList нужно записать тип круга + его коорды,а я планировал их считывать с Label
« Последнее редактирование: Май 25, 2015, 18:54 от Ni@ck » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Недавно начала изучать Qt(мес. назад),т.к. дали задание сделать граф редактор.
Рисовать круги и получать их координаты, помещать их в QList.
Круги я нарисовал, добавив QGraphicsView и установив сцену, рисую круги посредством добавления их на сцену как QgraphicsPixmapItem;
Вы перемудрили и переусложнили себе задачу. Чтобы просто рисовать круги - QGraphicsView совершенно не нужен. А задействовать QgraphicsPixmapItem совсем плохо - круг можно хранить в виде "центр + радиус", а пиксмап - целая картинка которую надо перестраивать.

Нужно просто-напросто рисовать круги в paintEvent, задание "более чем лояльноe"
Записан
YaTT
Гость
« Ответ #5 : Май 26, 2015, 08:49 »

Вы перемудрили и переусложнили себе задачу. Чтобы просто рисовать круги - QGraphicsView совершенно не нужен. А задействовать QgraphicsPixmapItem совсем плохо - круг можно хранить в виде "центр + радиус", а пиксмап - целая картинка которую надо перестраивать.

Нужно просто-напросто рисовать круги в paintEvent, задание "более чем лояльноe"

Окей, днём попробую сделать через paintEvent
« Последнее редактирование: Май 26, 2015, 09:06 от Ni@ck » Записан
YaTT
Гость
« Ответ #6 : Май 26, 2015, 12:20 »

А почему бы просто не добавлять на сцену круги, без paintEvent?
 
Код
C++ (Qt)
ellipse = scene->addEllipse(x,y,d,d,QPen(Qt::black),QBrush(Qt::white));
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Май 26, 2015, 15:48 »

Через paintEvent не сложно делать Улыбающийся
По работе делал минимальный пример рисования, и вспомнил о этой теме:

Код
C++ (Qt)
#include <QWidget>
#include <QPainter>
#include <QRectF>
#include <QMouseEvent>
#include <QDebug>
 
class PainterWindow : public QWidget
{
   Q_OBJECT
public:
   explicit PainterWindow(QWidget *parent = 0) : QWidget(parent) {
       rect = QRectF(30, 30, 60, 60);
       press = false;
       paintNewRect = false;
   }
 
signals:
 
public slots:
 
public:
   QRectF rect;
   QPointF lastPos;
   bool press;
 
   bool paintNewRect;
   QPointF startPos;
 
protected:
   void paintEvent(QPaintEvent *) {
       QPainter p(this);
       p.setBrush(Qt::red);
       p.drawRect(rect);
   }
   void mouseMoveEvent(QMouseEvent * e) {
       if (press) {
           QPointF delta = e->posF() - lastPos;
 
           // Меняем размеры фигуры мышкой
           if (paintNewRect) {
               rect.setTopLeft(startPos);
               rect.setBottomRight(e->posF());
 
           } else { // Передвигаем фигуру
               rect.setX(rect.x() + delta.x());
               rect.setY(rect.y() + delta.y());
               rect.setWidth(rect.width() + delta.x());
               rect.setHeight(rect.height() + delta.y());
           }
 
           update();
       }
 
       lastPos = e->posF();
   }
   void mousePressEvent(QMouseEvent * e) {
       press = true;
       lastPos = e->posF();
 
       // Если мимо фигуры попали, включаем режим изменения
       // размера фигуры мышкой, иначе передвигаем фигуру
       paintNewRect = !rect.contains(lastPos);
       startPos = lastPos;
   }
   void mouseReleaseEvent(QMouseEvent *) {
       press = false;
       paintNewRect = false;
   }
};
 
Записан

YaTT
Гость
« Ответ #8 : Май 26, 2015, 18:54 »

Вот что я накалякал, всё хорошо рисуется,НО, как сделать так, чтобы круг рисовался на QGraphicsScene + рисование по кнопки\экшэну.
Код
C++ (Qt)
 
//mainwindow.h
  void paintEvent(QPaintEvent *)
{
 
   QPainter p(this);
   p.setPen(Qt::red);
   QPoint point(200,200);
   p.drawEllipse(point,70,70);
   p.setPen(Qt::black);
   p.drawLine(QPointF(200,130),QPointF(200,270));
   p.drawLine(QPointF(130,200),QPointF(270,200));
 
}
как я понял, чтобы рисовать по щелчку по кнопке\экшэну, нужно сделать Signal-slot.
допустим
    connect(ui->button1,SIGNAL(clicked(bool)),this,SLOT(paintEvent(QPaintEvent*)));
но круг всё равно рисуется при запуске программы,а не при нажатии
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Май 26, 2015, 19:06 »

Вот что я накалякал, всё хорошо рисуется,НО, как сделать так, чтобы круг рисовался на QGraphicsScene + рисование по кнопки\экшэну.
Код
C++ (Qt)
 
//mainwindow.h
  void paintEvent(QPaintEvent *)
{
 
   QPainter p(this);
   p.setPen(Qt::red);
   QPoint point(200,200);
   p.drawEllipse(point,70,70);
   p.setPen(Qt::black);
   p.drawLine(QPointF(200,130),QPointF(200,270));
   p.drawLine(QPointF(130,200),QPointF(270,200));
 
}
как я понял, чтобы рисовать по щелчку по кнопке\экшэну, нужно сделать Signal-slot.
допустим
    connect(ui->button1,SIGNAL(clicked(bool)),this,SLOT(paintEvent(QPaintEvent*)));
но круг всё равно рисуется при запуске программы,а не при нажатии

Для обновления вызывается слот update, а этот слот вызовет метод-событие paintEvent
Записан

YaTT
Гость
« Ответ #10 : Май 26, 2015, 19:21 »

Для обновления вызывается слот update, а этот слот вызовет метод-событие paintEvent
Код
C++ (Qt)
   connect(ui->button1,SIGNAL(clicked(bool)),this,SLOT(update(paintEvent(QPaintEvent *))));
вот так?если да, то всё равно круг рисуется не по нажатию.
нет?тогда как  Обеспокоенный
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #11 : Май 26, 2015, 20:48 »

Для обновления вызывается слот update, а этот слот вызовет метод-событие paintEvent
Код
C++ (Qt)
   connect(ui->button1,SIGNAL(clicked(bool)),this,SLOT(update(paintEvent(QPaintEvent *))));
вот так?если да, то всё равно круг рисуется не по нажатию.
нет?тогда как  Обеспокоенный

Правильно было бы так:
connect(ui->button1,SIGNAL(clicked()),this,SLOT(update()));

Добавил пример рисования / удаления эллипсов через кнопки и paintEvent
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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