Михаиллл1 сентября 2019 г. 11:09
Как обращаться к объектам QGraphicsItem созданным в QGraphicsView
Добрый день.
С помощью такого класса создаю эллементы в 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 и заминить картинки?
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
B
- Bogdannn
- 28 марта 2024 г. 2:15
C++ - Тест 001. Первая программа и типы данных
- Результат:46баллов,
- Очки рейтинга-6
Последние комментарии
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5 февраля 2024 г. 9:50
EVA25 декабря 2023 г. 18:30
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев14 апреля 2024 г. 9:35
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
Alexandru Codreanu19 января 2024 г. 19:57
Вот так можно обратится к объектам класса.
items() - возвращает массив с объектами
Нет, так получилось толькоо узнать количество объектов, но так нельзя обратиться к объекту. Может быть вы знаете, как можно обратится к объекту класса?
Видимо мне нужно переопределить метод items(), но как?