Russian Qt Forum
Ноябрь 01, 2024, 09:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: получение порядкового номера предмета со сцены  (Прочитано 6662 раз)
K26Tony
Гость
« : Июль 17, 2015, 08:38 »

День добрый, подскажите пожалуйста, у меня есть сцена, она заполняется двухмерным массивом квадратов(item), можно ли как то нумеровать эти элементы, что бы при нажатии на любой из них получить их порядковый номер в массиве, например i,j?
Записан
Bepec
Гость
« Ответ #1 : Июль 17, 2015, 09:28 »

Самый простой вариант, сделайте объекту квадрату поля i,j и заполняйте их при создании. А при клике показывайте.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Июль 17, 2015, 10:22 »

да, придется писать наследников с добавленными полями, по другому можно, но на сколько это будет эффективно ..
можете завести хеш таблицу вида QHash<QGraphicsItem*,QPoint>, ключи - это добавляемые элементы, а значения QPoint, где x и y будут вашие искомые i - j. Но в этом случае нужно так же обрабатывать удаление элементов, что бы в хеше не висели мертвые указатели.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июль 17, 2015, 10:23 »

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

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Июль 17, 2015, 14:10 »

да, все гениальное просто.. забыл за этот метод.. сказывается медленный переход на яву..
Записан
K26Tony
Гость
« Ответ #5 : Июль 27, 2015, 07:50 »

Не могли бы пояснить поподробнее

Цитата: assistant
Код
C++ (Qt)
void QGraphicsItem::setData(int key, const QVariant & value)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Июль 27, 2015, 11:44 »

Я так понимаю, что при создании item можно сделать что-то типа:

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #7 : Июль 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();
Записан
K26Tony
Гость
« Ответ #8 : Июль 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);
}


Записан
Bepec
Гость
« Ответ #9 : Июль 28, 2015, 13:34 »

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

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

PS Дополнительного кода, кроме этих 7 строк НЕ НАДО Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.143 секунд. Запросов: 22.