Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: K26Tony от Июль 17, 2015, 08:38



Название: получение порядкового номера предмета со сцены
Отправлено: K26Tony от Июль 17, 2015, 08:38
День добрый, подскажите пожалуйста, у меня есть сцена, она заполняется двухмерным массивом квадратов(item), можно ли как то нумеровать эти элементы, что бы при нажатии на любой из них получить их порядковый номер в массиве, например i,j?


Название: Re: получение порядкового номера предмета со сцены
Отправлено: Bepec от Июль 17, 2015, 09:28
Самый простой вариант, сделайте объекту квадрату поля i,j и заполняйте их при создании. А при клике показывайте.


Название: Re: получение порядкового номера предмета со сцены
Отправлено: Fregloin от Июль 17, 2015, 10:22
да, придется писать наследников с добавленными полями, по другому можно, но на сколько это будет эффективно ..
можете завести хеш таблицу вида QHash<QGraphicsItem*,QPoint>, ключи - это добавляемые элементы, а значения QPoint, где x и y будут вашие искомые i - j. Но в этом случае нужно так же обрабатывать удаление элементов, что бы в хеше не висели мертвые указатели.


Название: Re: получение порядкового номера предмета со сцены
Отправлено: GreatSnake от Июль 17, 2015, 10:23
Цитата: assistant
Код
C++ (Qt)
void QGraphicsItem::setData(int key, const QVariant & value)


Название: Re: получение порядкового номера предмета со сцены
Отправлено: Fregloin от Июль 17, 2015, 14:10
да, все гениальное просто.. забыл за этот метод.. сказывается медленный переход на яву..


Название: Re: получение порядкового номера предмета со сцены
Отправлено: K26Tony от Июль 27, 2015, 07:50
Не могли бы пояснить поподробнее

Цитата: assistant
Код
C++ (Qt)
void QGraphicsItem::setData(int key, const QVariant & value)


Название: Re: получение порядкового номера предмета со сцены
Отправлено: Racheengel от Июль 27, 2015, 11:44
Я так понимаю, что при создании item можно сделать что-то типа:

item->setData(KEY_I, i);
item->setData(KEY_J, j);

ну и KEY_I и KEY_J соответственно где-то задать до этого.


Название: Re: получение порядкового номера предмета со сцены
Отправлено: Bepec от Июль 27, 2015, 12:17
Объявить
Код:
#define KEY_I Qt::UserRole+1
#define KEY_J Qt::UserRole+2

Установить
Код:
item->setData(KEY_I, i);
item->setData(KEY_J, j);

Прочитать
Код:
int i,j;
i = item->data(KEY_I).toInt();
j = item->data(KEY_J).toInt();


Название: Re: получение порядкового номера предмета со сцены
Отправлено: K26Tony от Июль 28, 2015, 07:47
Что то я толком так и не могу разобраться с этими свойствами объектов классов. Исправьте пожалуйста код что бы все правильно было. Мне бы хоть один пример полный посмотреть, тогда все пойму :) Идея в том что бы вывести двумерный массив объектов с данными. Дальше мне все понятно. Может быть я совсем не то делаю с классом этого квадрата. И еще как правильно ключ с переменной связать в классе?


Код:
//////////////////////// myitem.h ////////////////////////////////
#ifndef MYITEM_H
#define MYITEM_H
#include <QPainter>
#include <QGraphicsItem>
#include <QDebug>
#include <QMessageBox>

class MyItem : public QGraphicsItem
{
public:
    int i,j;
    MyItem();
    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

    void setData(int key, const QVariant &value)   
   {
        i=value.toInt();
    }

    ~MyItem();
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);

private:
    QMessageBox *qb;

};

#endif // MYITEM_H


//////////////////////// myitem.cpp ////////////////////////
MyItem::MyItem()
{
}


void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{

    QRectF rec = boundingRect();
    QBrush brush(Qt::blue);

    painter->fillRect(rec,brush);
    painter->drawRect(rec);
}

void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mousePressEvent(event);
    qb = new QMessageBox();
 //   qb->setText(QString::number(ik)+" "+QString::number(jk));
    qb->show();
}

MyItem::~MyItem(){}

//////////////////////// dialog.cpp   //////////////////////////
#include "dialog.h"
#include "ui_dialog.h"

#define KEY_I Qt::UserRole+1
#define KEY_J Qt::UserRole+2
   
    int i1,j1;


Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{

    ui->setupUi(this);

    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);
   square = new MyItem();

    for (j1=0; j1<10; j1++)
        for (i1=0; i1<10; i1++)
 {
         square->setData(KEY_I, i1);
         square->setData(KEY_J, j1);
         scene->addItem(square);
}

}

Dialog::~Dialog()
{
    delete ui;
}

QRectF MyItem::boundingRect() const
{

    return QRectF(i1*5,j1*5,3,3);
}




Название: Re: получение порядкового номера предмета со сцены
Отправлено: Bepec от Июль 28, 2015, 13:34
Вы в своём классе НЕ переопределяете методы setData и data. Потом берёте мой код "Установить" из предыдущего и вставляете в цикл. При клике, в функцию вы вставляете мой код "Прочитать".

Это будет работать на любых объектах QGraphicsItem и их наследников.

PS Дополнительного кода, кроме этих 7 строк НЕ НАДО :)