Михаиллл
Михаиллл13 червня 2019 р. 02: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 р. 08:55

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

      Evgenii Legotckoi
      • 24 червня 2019 р. 05:50

      Обычно я этот

       MoveItem *item
      

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

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

        Коментарі

        Only authorized users can post comments.
        Please, Log in or Sign up
        AD

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

        • Результат:50бали,
        • Рейтинг балів-4
        m
        • molni99
        • 26 жовтня 2024 р. 01:37

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

        • Результат:80бали,
        • Рейтинг балів4
        m
        • molni99
        • 26 жовтня 2024 р. 01:29

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

        • Результат:20бали,
        • Рейтинг балів-10
        Останні коментарі
        ИМ
        Игорь Максимов22 листопада 2024 р. 11:51
        Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii Legotckoi31 жовтня 2024 р. 14:37
        Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZE19 жовтня 2024 р. 08:19
        Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов05 жовтня 2024 р. 07:51
        Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas505 липня 2024 р. 11:02
        QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Тепер обговоріть на форумі
        Evgenii Legotckoi
        Evgenii Legotckoi24 червня 2024 р. 15:11
        добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
        t
        tonypeachey115 листопада 2024 р. 06:04
        google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
        NSProject
        NSProject04 червня 2022 р. 03:49
        Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
        9
        9Anonim25 жовтня 2024 р. 09:10
        Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

        Слідкуйте за нами в соціальних мережах