Михаиллл
1 сентября 2019 г. 21:09

Как обращаться к объектам QGraphicsItem созданным в QGraphicsView

QGraphicsView, QGraphicsItem

Добрый день.
С помощью такого класса создаю эллементы в QGraphicsView

  1. class MoveItem : public QObject, public QGraphicsItem
  2. {
  3. Q_OBJECT
  4. public:
  5. explicit MoveItem(QObject *parent = 0);
  6. ~MoveItem();
  7. int id;
  8. int width, height;
  9.  
  10. private:
  11. QRectF boundingRect() const;
  12. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
  13. void mouseMoveEvent(QGraphicsSceneMouseEvent *event); //движение с нажатой кнопкой
  14. void mousePressEvent(QGraphicsSceneMouseEvent *event); //нажатие кнопки
  15. void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); //отпускание кнопки
  16. };
  1. QRectF MoveItem::boundingRect() const
  2. {
  3. return QRectF (-width/2,-height/2,width,height);
  4. }
  5.  
  6. void MoveItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  7. {
  8. QImage image(":/Images/Images/" + QString::number(id) + ".png");
  9. QRect recrangle(-width/2,-height/2,width,height);
  10. painter->drawImage(recrangle, image);
  11. Q_UNUSED(option);
  12. Q_UNUSED(widget);
  13. }

Создаю объект класса, задаю ему id , размер и расположение:

  1. static int randomBetween(int low, int high)
  2. {
  3. return (qrand() % ((high + 1) - low) + low);
  4. }
  5.  
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11.  
  12. QPushButton* button = new QPushButton("Button in View", ui->graphicsView);
  13. button->setGeometry({25, 25, button->geometry().width(), button->geometry().height()});
  14.  
  15. scene = new QGraphicsScene(this); // Инициализируем графическую сцену
  16. scene->setItemIndexMethod(QGraphicsScene::NoIndex); // настраиваем индексацию элементов
  17.  
  18. ui->graphicsView->setScene(scene); // Устанавливаем графическую сцену в graphicsView
  19. ui->graphicsView->setRenderHint(QPainter::Antialiasing); // Настраиваем рендер
  20. ui->graphicsView->setCacheMode(QGraphicsView::CacheBackground); // Кэш фона
  21. ui->graphicsView->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
  22.  
  23. //scene
  24. scene->setSceneRect(0,0,1920,1080); // Устанавливаем размер сцены
  25. QImage fonImage(":/Images/Images/fon.png");
  26. fonImage = fonImage.scaled(1920, 1080, Qt::IgnoreAspectRatio);
  27. qDebug()<<fonImage.size();
  28.  
  29. scene->addPixmap(QPixmap::fromImage(fonImage));//add image
  30.  
  31. loadImages();
  32. }
  33.  
  34. Widget::~Widget()
  35. {
  36. delete ui;
  37. }
  38.  
  39. void Widget::loadImages()
  40. {
  41. id1.append(1); width1.append(40); height1.append(80); x1.append(98); y1.append(195); tipOth.append("Текстиль"); nameOth.append("Мочалка");
  42. id1.append(2); width1.append(40); height1.append(80); x1.append(193); y1.append(203); tipOth.append("Текстиль"); nameOth.append("Полотеце");
  43. id1.append(3); width1.append(20); height1.append(50); x1.append(32); y1.append(473); tipOth.append("Пластик"); nameOth.append("Пластикавая банка");
  44. id1.append(4); width1.append(30); height1.append(25); x1.append(65); y1.append(489); tipOth.append("Пластик"); nameOth.append("Пластикавая щетка");
  45. id1.append(5); width1.append(50); height1.append(150); x1.append(82); y1.append(388); tipOth.append("Металл"); nameOth.append("Металическая швабра");
  46. id1.append(6); width1.append(50); height1.append(150); x1.append(113); y1.append(394); tipOth.append("Пластик"); nameOth.append("Пластикавая швабра");
  47. id1.append(7); width1.append(80); height1.append(35); x1.append(128); y1.append(479); tipOth.append("Металл"); nameOth.append("Металический таз");
  48. id1.append(8); width1.append(40); height1.append(50); x1.append(175); y1.append(442); tipOth.append("Пластик"); nameOth.append("Пластикавая канистра");
  49. id1.append(9); width1.append(50); height1.append(60); x1.append(242); y1.append(465); tipOth.append("Пластик"); nameOth.append("Пластиковое ведро");
  50. id1.append(10); width1.append(20); height1.append(60); x1.append(302); y1.append(411); tipOth.append("Пластик"); nameOth.append("Пластикавая бутылка");
  51. id1.append(11); width1.append(20); height1.append(60); x1.append(329); y1.append(413); tipOth.append("Пластик"); nameOth.append("Пластикавая бутылка");
  52. id1.append(12); width1.append(50); height1.append(40); x1.append(409); y1.append(336); tipOth.append("Пластик"); nameOth.append("Резиновые перчатки");
  53.  
  54. for (int i = 0; i< id1.size(); i++)
  55. {
  56. MoveItem *item = new MoveItem(); // Создаём графический элемент
  57. item->setPos(x1[i], y1[i]);// Устанавливаем случайную позицию элемента
  58. item->id = id1[i]; // set id
  59. item->width = width1[i];
  60. item->height = height1[i];
  61. scene->addItem(item); // Добавляем элемент на графическую сцену
  62. }
  63. }

Как можно обратится к объектам MoveItem и заминить картинки?

2

Вам это нравится? Поделитесь в социальных сетях!

3
Михаиллл
  • 1 сентября 2019 г. 23:07
  • Ответ был помечен как решение.

Вот так можно обратится к объектам класса.

  1. qDebug()<<scene->items()[2];

items() - возвращает массив с объектами

    Михаиллл
    • 1 сентября 2019 г. 23:24

    Нет, так получилось толькоо узнать количество объектов, но так нельзя обратиться к объекту. Может быть вы знаете, как можно обратится к объекту класса?

      Михаиллл
      • 2 сентября 2019 г. 0:58

      Видимо мне нужно переопределить метод items(), но как?

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь