Михаиллл
МихаилллМаусым 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, 5 Т.Қ.

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

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

В примере предлагается переопределить класс 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; потом по сигналам нажатия выдёргиваю из веторов и удаляю. Есть пример удаления в одном из уроков по написанию игры

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

        Пікірлер

        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
        Кіріңіз немесе Тіркеліңіз
        AD

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

        • Нәтиже:50ұпай,
        • Бағалау ұпайлары-4
        m
        • molni99
        • Қаз. 26, 2024, 1:37 Т.Ж.

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

        • Нәтиже:80ұпай,
        • Бағалау ұпайлары4
        m
        • molni99
        • Қаз. 26, 2024, 1:29 Т.Ж.

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

        • Нәтиже:20ұпай,
        • Бағалау ұпайлары-10
        Соңғы пікірлер
        ИМ
        Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
        Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
        Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
        Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas5Шілде 5, 2024, 11:02 Т.Ж.
        QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Енді форумда талқылаңыз
        m
        moogoҚар. 22, 2024, 7:17 Т.Ж.
        Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
        Evgenii Legotckoi
        Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        t
        tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        NSProject
        NSProjectМаусым 4, 2022, 3:49 Т.Ж.
        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

        Бізді әлеуметтік желілерде бақылаңыз