F
Fidan29 июня 2017 г. 1:45

QGraphicsScene

Qt

Здравствуйте, можно ли при помощи Qt реализовать следующее:

При помощи QGraphicsScene в GraphicsView добавляется несколько объектов  (допустим квадраты)
Можно ли сделать так, чтобы при двойном щелчке по объекту можно было распознать данный объект, т.е. при прорисовке присвоить ему имя или индекс, а потом при щелчке возвращать его имя.
Заранее спасибо.
 
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

1
Evgenii Legotckoi
  • 30 июня 2017 г. 13:38

Добрый день.

Тут всё зависит от того, в каком контексте и как работать с графическими объектами. Если Вам нужно только забрать имя этого объекта, к примеру, то можно перегрузить метод mouseDoubleClickEvent и выбрасывать имя (какой-нибудь title) этого объекта через сигнал/слотовое соединение. Чтобы использовать сигналы и слоты в QGraphicsItem, то нужно использовать множественное наследование, как это сделано в этой статье , или наследоваться от QGraphicsObject , что в общем-то одно и тоже, если заглянуть в исходники класса QGraphicsObject.

Допустим есть некий InfoItem, который имеет в своём составе title.
infoitem.h
#ifndef INFOITEM_H
#define INFOITEM_H

#include <QGraphicsObject>
#include <QPainter>

class InfoItem : public QGraphicsObject
{
    Q_OBJECT
public:
    explicit InfoItem(QString title, QGraphicsItem *parent = nullptr);
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

protected:
    virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;

signals:
    void doubleClicked(const QString& title);

private:
    QString m_title;
};

#endif // INFOITEM_H
infoitem.cpp
#include "infoitem.h"

InfoItem::InfoItem(QString title, QGraphicsItem *parent)
    : QGraphicsObject(parent),
      m_title(title)
{

}

QRectF InfoItem::boundingRect() const
{
    return QRectF (-20, -20, 40, 40);
}

void InfoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->setPen(Qt::black);
    painter->setBrush(Qt::green);
    painter->drawRect(-20, -20, 40, 40);
    Q_UNUSED(option);
    Q_UNUSED(widget);
}

void InfoItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
    emit doubleClicked(m_title);
    QGraphicsObject::mouseDoubleClickEvent(event);
}
А в виджете уже объявляем сцену, куда добавляем эти графические объекты. Также поключаем слот к сигналу doubleClicked, который передаёт title этого графического объекта (в данном случае я воспользовался лямбда функцией), где при Double Click будем высвечивать наименование кликнутого объекта.
widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGraphicsScene>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QGraphicsScene *m_scene;
};

#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"

#include "infoitem.h"

/* Функция для получения рандомного числа
 * в диапазоне от минимального до максимального
 * */
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);
    this->resize(640,640);
    this->setFixedSize(640,640);

    m_scene = new QGraphicsScene(this);
    ui->graphicsView->resize(600,600);
    ui->graphicsView->setScene(m_scene);

    for (int i = 0; i < 10; ++i)
    {
        InfoItem* item = new InfoItem("Info Item number - " + QString::number(i));
        item->setPos(randomBetween(50, 550), randomBetween(50, 550));
        m_scene->addItem(item);

        connect(item, &InfoItem::doubleClicked, [this](const QString& str){
            ui->label->setText(str);
        });
    }
}

Widget::~Widget()
{
    delete ui;
}
Это один из вариантов того, как можно получать информацию из графических объектов.
Также можно добавлять графические объекты в специальный вектор, а по дабл клику передавать некий идентификатор, по которому уже забирать указатель на эти графические объекты из вектора, чтобы что-то с ним сделать.
Во вложении архив с проектом.

    Комментарии

    Только авторизованные пользователи могут публиковать комментарии.
    Пожалуйста, авторизуйтесь или зарегистрируйтесь
    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
    Последние комментарии
    i
    innorwall13 ноября 2024 г. 23:03
    Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
    i
    innorwall13 ноября 2024 г. 20:09
    Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
    i
    innorwall11 ноября 2024 г. 22:12
    Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
    i
    innorwall11 ноября 2024 г. 18:23
    QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
    i
    innorwall11 ноября 2024 г. 15:50
    Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
    Сейчас обсуждают на форуме
    i
    innorwall14 ноября 2024 г. 0:39
    добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
    i
    innorwall11 ноября 2024 г. 10:55
    Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
    9
    9Anonim25 октября 2024 г. 9:10
    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
    ИМ
    Игорь Максимов3 октября 2024 г. 4:05
    Реализация навигации по разделам Спасибо Евгений!

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