Sept. 1, 2019, 11:09 a.m.

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

QGraphicsView, QGraphicsItem

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

class MoveItem : public QObject, public QGraphicsItem
{
    Q_OBJECT
public:
    explicit MoveItem(QObject *parent = 0);
    ~MoveItem();
    int id;
    int width, height;

private:
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);     //движение с нажатой кнопкой
    void mousePressEvent(QGraphicsSceneMouseEvent *event);    //нажатие кнопки
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);  //отпускание кнопки
};
QRectF MoveItem::boundingRect() const
{
    return QRectF (-width/2,-height/2,width,height);
}

void MoveItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QImage image(":/Images/Images/" + QString::number(id) + ".png");
    QRect recrangle(-width/2,-height/2,width,height);
    painter->drawImage(recrangle, image);
    Q_UNUSED(option);
    Q_UNUSED(widget);
}

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

static int randomBetween(int low, int high)
{
    return (qrand() % ((high + 1) - low) + low);
}

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPushButton* button = new QPushButton("Button in View", ui->graphicsView);
    button->setGeometry({25, 25, button->geometry().width(), button->geometry().height()});

    scene = new QGraphicsScene(this);   // Инициализируем графическую сцену
    scene->setItemIndexMethod(QGraphicsScene::NoIndex); // настраиваем индексацию элементов

    ui->graphicsView->setScene(scene);  // Устанавливаем графическую сцену в graphicsView
    ui->graphicsView->setRenderHint(QPainter::Antialiasing);    // Настраиваем рендер
    ui->graphicsView->setCacheMode(QGraphicsView::CacheBackground); // Кэш фона
    ui->graphicsView->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);

    //scene
    scene->setSceneRect(0,0,1920,1080); // Устанавливаем размер сцены
    QImage fonImage(":/Images/Images/fon.png");
    fonImage = fonImage.scaled(1920, 1080, Qt::IgnoreAspectRatio);
    qDebug()<<fonImage.size();

    scene->addPixmap(QPixmap::fromImage(fonImage));//add image

    loadImages();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::loadImages()
{
    id1.append(1); width1.append(40); height1.append(80); x1.append(98); y1.append(195); tipOth.append("Текстиль"); nameOth.append("Мочалка");
    id1.append(2); width1.append(40); height1.append(80); x1.append(193); y1.append(203); tipOth.append("Текстиль"); nameOth.append("Полотеце");
    id1.append(3); width1.append(20); height1.append(50); x1.append(32); y1.append(473); tipOth.append("Пластик"); nameOth.append("Пластикавая банка");
    id1.append(4); width1.append(30); height1.append(25); x1.append(65); y1.append(489); tipOth.append("Пластик"); nameOth.append("Пластикавая щетка");
    id1.append(5); width1.append(50); height1.append(150); x1.append(82); y1.append(388); tipOth.append("Металл"); nameOth.append("Металическая швабра");
    id1.append(6); width1.append(50); height1.append(150); x1.append(113); y1.append(394); tipOth.append("Пластик"); nameOth.append("Пластикавая швабра");
    id1.append(7); width1.append(80); height1.append(35); x1.append(128); y1.append(479); tipOth.append("Металл"); nameOth.append("Металический таз");
    id1.append(8); width1.append(40); height1.append(50); x1.append(175); y1.append(442); tipOth.append("Пластик"); nameOth.append("Пластикавая канистра");
    id1.append(9); width1.append(50); height1.append(60); x1.append(242); y1.append(465); tipOth.append("Пластик"); nameOth.append("Пластиковое ведро");
    id1.append(10); width1.append(20); height1.append(60); x1.append(302); y1.append(411); tipOth.append("Пластик"); nameOth.append("Пластикавая бутылка");
    id1.append(11); width1.append(20); height1.append(60); x1.append(329); y1.append(413); tipOth.append("Пластик"); nameOth.append("Пластикавая бутылка");
    id1.append(12); width1.append(50); height1.append(40); x1.append(409); y1.append(336); tipOth.append("Пластик"); nameOth.append("Резиновые перчатки");

    for (int i = 0; i< id1.size(); i++)
    {
        MoveItem *item = new MoveItem();        // Создаём графический элемент
        item->setPos(x1[i], y1[i]);// Устанавливаем случайную позицию элемента
        item->id = id1[i]; // set id
        item->width = width1[i];
        item->height = height1[i];
        scene->addItem(item);   // Добавляем элемент на графическую сцену
    }
}

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
3
  • Sept. 1, 2019, 1:07 p.m.
  • The answer was marked as a solution.

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

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

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

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

JuA
Sept. 17, 2019, 8:51 a.m.
Julija Aleksandrova

C++ - Test 001. The first program and data types

  • Result:33points,
  • Rating points-10
JuA
Sept. 17, 2019, 8:36 a.m.
Julija Aleksandrova

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:10points,
  • Rating points-10
VD
Sept. 16, 2019, 11:47 a.m.
Viktor Dzen'kiv

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
Last comments
Sept. 17, 2019, 6:07 a.m.
Misha Lebedev

Кстати интересные темы нашёл тут https://emacsway.github.io/ru/django-framework/#django-models Может что полезного тоже Евгений найдёте
Sept. 17, 2019, 4:50 a.m.
Misha Lebedev

Доброго времени суток. Спасибо за хороший ответ, У меня ситуация така что в галлереи будет несколько миллионов фотографий с фильтрами и тегами , и я опасаюсь за производительност . Это ос…
Sept. 17, 2019, 3:23 a.m.
Evgenij Legotskoj

Добрый день. Да, я тоже читал ту статью в своё время и согласен с тем, что внешние ключи гораздо лучше, чем GenericForeignKey. Выборки в ряде случае работают быстрее. Но лично мне про…
Sept. 14, 2019, 5:08 p.m.
Misha Lebedev

Приветствую вас Евгений , давно наблюда за развитием вашего замечательного портала, много полезно тут нашел , переодически зачитываюсь. Теперь по сушеству, делаю портал и там идеально ложи…
Sept. 10, 2019, 4:38 p.m.
Evgenij Legotskoj

function view для модели Article и LikeDislike.LIKE будет выглядеть так def like(request, pk): obj = Article.objects.get(pk=pk) try: likedislike = LikeDislike.objects.get(cont…
Now discuss on the forum
p
Sept. 17, 2019, 5:02 a.m.
pstMem

Да, действительно нужно дебажить, по другому не словить исключение. Уже решил проблему, был выход за предел массива, не правильные входные данные, так что всегда проверяйте размер массива.
Sept. 17, 2019, 3:39 a.m.
Evgenij Legotskoj

Добрый день! На удалённом сервере вряд ли. Этот класс из core модуля, а удалённый сервер - это ещё и network модуль нужно подтягивать. Тут на удалэнном сервере нужно делать программу…
Sept. 17, 2019, 3:30 a.m.
Evgenij Legotskoj

Добрый день! Попробуйте toHex() А также создние QString с помощью from методов. Может быть QString::fromLatin1(). В документации на QString почти два десятка методов from, один из них…
m
Sept. 16, 2019, 1:54 p.m.
mihamuz

Однозначно PostgreSql не ниже 10 ки.
R
Sept. 16, 2019, 7:09 a.m.
RED_Spider

прочитайте https://doc.qt.io/archives/qt-5.11/osx-deployment.html QMAKE_POST_LINK += "~/Qt/5.12.0/clang_64/bin/macdeployqt $${TARGET}.app $$escape_expand( \\n\\t )"
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB