Михаиллл
Михаиллл13 июня 2019 г. 2:05

Рисование в QGraphicsScene, как выделить объект

Добрый день.
Рисую в QGraphicsScene мышкой, ниже код сцены (сделан на основе урока).
В Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью описан вариант перетаскивания. Скажите пожалуйста как можно подключить этот вариант перетаскивания к описаному варианту рисования?
h

#ifndef PAINTSCENE_H
#define PAINTSCENE_H

#include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent>
#include "QGraphicsView"
#include <QTimer>
#include <QDebug>
//#include "QLabel"
//#include "QPainter"




class paintScene : public QGraphicsScene
{

    Q_OBJECT

public:
    explicit paintScene(QObject *parent = 0);
    ~paintScene();
    QPen myPen;
    //переменная для режима рисования или перепещения с удалением
    QString paintOrDelete = "рисовать"; //"удалять, перетаскивать"

    //QGraphicsView *myQGraphicsScene;
    //paintScene *scene;  // Объявляем кастомную графическую сцену
    //QPainter test
    //QPainter myPainter;

    //int x,y;
    //void paintEvent(QPaintEvent *event);


private:
    QPointF     previousPoint;      // Координаты предыдущей точки
    bool buttonIsPressed;

private:
    // Для векторного рисования используем события мыши
    //временно срыл рисование векторной графики
    void mousePressEvent(QGraphicsSceneMouseEvent * event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

};

#endif // PAINTSCENE_H

cpp

#include "paintscene.h"


paintScene::paintScene(QObject *parent) : QGraphicsScene(parent)
{
    //myQGraphicsScene = new QGraphicsView();
    //scene = new paintScene();       // Инициализируем графическую сцену

    //Pen
    myPen.setWidth(20);
    myPen.setColor(Qt::green);
    //myPen.setColor(QColor(255, 0, 0, 10));
    myPen.setCapStyle(Qt::RoundCap);
    myPen.setStyle(Qt::SolidLine);

}

paintScene::~paintScene()
{

}

void paintScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if (paintOrDelete == "рисовать")
    {
        // При нажатии кнопки мыши отрисовываем эллипс
        addEllipse(event->scenePos().x() -  myPen.width()/2,
                   event->scenePos().y() -  myPen.width()/2,
                   myPen.width(),
                   myPen.width(),
                   QPen(Qt::NoPen),
                   QBrush(myPen.color()));
        // Сохраняем координаты точки нажатия
        previousPoint = event->scenePos();
        buttonIsPressed = true;


        //для рисования попиксельно
        //x = event->scenePos().x();
        //y = event->scenePos().x();
    }
    /*if (paintOrDelete == "удалять, перетаскивать")
    {
        /* При нажатии мышью на графический элемент
         * заменяем курсор на руку, которая держит этот элемента
         * */
        /*this->setCursor(QCursor(Qt::ClosedHandCursor));
        Q_UNUSED(event);

        //удаление правой кнопкой мыши
        if (QApplication::mouseButtons() == Qt::RightButton)
        {
            this->deleteLater();
        }
    }*/
}

void paintScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    //if (paintOrDelete == "рисовать")
    {
        if (buttonIsPressed)
        {
            // Отрисовываем линии с использованием предыдущей координаты
            addLine(previousPoint.x(),
                    previousPoint.y(),
                    event->scenePos().x(),
                    event->scenePos().y(),
                    myPen);
            // Обновляем данные о предыдущей координате
            previousPoint = event->scenePos();
        }
    }
    /*if (paintOrDelete == "удалять, перетаскивать")
    {
        /* Устанавливаем позицию графического элемента
         * в графической сцене, транслировав координаты
         * курсора внутри графического элемента
         * в координатную систему графической сцены
         * */
        /*this->setPos(mapToScene(event->pos()));
    }*/
}

void paintScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    buttonIsPressed = false;
    /*if (paintOrDelete == "удалять, перетаскивать")
    {
        /* При отпускании мышью элемента
         * заменяем на обычный курсор стрелку
         * */
        /*this->setCursor(QCursor(Qt::ArrowCursor));
        Q_UNUSED(event);
    }*/
}

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

3
Evgenii Legotckoi
  • 16 июня 2019 г. 17:00

Дорбрый день.

К этому варианту с графической сценой лучше тот код вообще не прикручивать. Вы видите разницу меджу вашим кодом и кодом в примере?

В примере предлагается переопределить класс QGraphicsItem, а вы хотите прикрутить тот код к графической сцене. Вы только так усложните себе жизнь.

По факту, вам нужно заменить добавление линий, которое вы делаете через addLine, на методы addItem. И добавлять через метод addItem кастомный класс графической линии, в котором будет реализовано перемещении объектов, как было показано в той статье.

Либо устанавливать флаг перемещаемости для графического объекта. Возможно, что вам такого хватит

void Widget::on_pushButton_clicked()
{
    MoveItem *item = new MoveItem();        // Создаём графический элемент
    item->setPos(randomBetween(30, 470),    // Устанавливаем случайную позицию элемента
                 randomBetween(30, 470));

    item->setFlag(QGraphicsItem::ItemIsMovable); // делаем элемент перемещаемым

    scene->addItem(item);   // Добавляем элемент на графическую сцену
}
    Михаиллл
    • 19 июня 2019 г. 8:55

    Скажите пожалуйста, как его в таком случае перемещать и удалять?

      Evgenii Legotckoi
      • 24 июня 2019 г. 5:50

      Обычно я этот

       MoveItem *item
      

      помещаю в вектор std::vector m_items; потом по сигналам нажатия выдёргиваю из веторов и удаляю. Есть пример удаления в одном из уроков по написанию игры

      Смотрите слот для удаления яблок.

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        г
        • ги
        • 23 апреля 2024 г. 22:51

        C++ - Тест 005. Структуры и Классы

        • Результат:41баллов,
        • Очки рейтинга-8
        l
        • laei
        • 23 апреля 2024 г. 16:19

        C++ - Тест 004. Указатели, Массивы и Циклы

        • Результат:10баллов,
        • Очки рейтинга-10
        l
        • laei
        • 23 апреля 2024 г. 16:17

        C++ - Тест 003. Условия и циклы

        • Результат:50баллов,
        • Очки рейтинга-4
        Последние комментарии
        k
        kmssr9 февраля 2024 г. 2:43
        Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
        АК
        Анатолий Кононенко5 февраля 2024 г. 9:50
        Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
        EVA
        EVA25 декабря 2023 г. 18:30
        Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
        J
        JonnyJo25 декабря 2023 г. 16:38
        Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
        G
        Gvozdik19 декабря 2023 г. 5:01
        Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
        Сейчас обсуждают на форуме
        G
        Gar22 апреля 2024 г. 12:46
        Clipboard Как скопировать окно целиком в clipb?
        DA
        Dr Gangil Academics20 апреля 2024 г. 14:45
        Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
        a
        a_vlasov14 апреля 2024 г. 13:41
        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
        Павел Дорофеев
        Павел Дорофеев14 апреля 2024 г. 9:35
        QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
        f
        fastrex4 апреля 2024 г. 11:47
        Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

        Следите за нами в социальных сетях