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

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

        Пікірлер

        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
        Кіріңіз немесе Тіркеліңіз
        OI
        • Ora Iro
        • Жел. 24, 2024, 6:38 Т.Ж.

        C++ - Тест 001. Первая программа и типы данных

        • Нәтиже:40ұпай,
        • Бағалау ұпайлары-8
        AD

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

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

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

        • Нәтиже:80ұпай,
        • Бағалау ұпайлары4
        Соңғы пікірлер
        ИМ
        Игорь МаксимовҚар. 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 аналогично. Могу предположить, что из-за более новой верси…
        Енді форумда талқылаңыз
        n
        nklyҚаң. 3, 2025, 2:52 Т.Ж.
        Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
        AW
        Ayden WatkinsҚаң. 2, 2025, 12:09 Т.Ж.
        Why Paying for a Research Paper Can Be a Smart Choice Writing a research paper can be a daunting task, especially when faced with tight deadlines, complex topics, or a lack of resources. For many students, paying for a research paper is a practical…
        p
        pimacontrols85Жел. 31, 2024, 9:39 Т.Ж.
        Finding the Right Rittal Small Enclosure for Your Needs Rittal is a leading manufacturer of enclosures for industrial and IT applications. Their small enclosures offer a compact and reliable solution for a wide range of needs, from housing electronic…
        Donald Randolph
        Donald RandolphЖел. 30, 2024, 2:59 Т.Ж.
        Personal Injury lawyer Santa Monica As an experienced Santa Monica personal injury lawyer, Donald C. Randolph has recovered over $100 Million in verdicts and settlements for our clients. In severe injury cases, this compensation i…
        Nirvana Yoga School
        Nirvana Yoga SchoolЖел. 30, 2024, 5:13 Т.Ж.
        OAuth2.0 через VK, получение email Nirvana Yoga School is one of the most trusted and reputed traditional Rishikesh yoga courses , India certified by Yoga Alliance, USA. We aim to spread traditional yoga teachings so t…

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