Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alik от Март 16, 2015, 18:12



Название: Q_PROPERTY в классе трехмерного массива
Отправлено: alik от Март 16, 2015, 18:12
Добрый вечер!

Хочу задействовать метод Q_PROPERTY в своем классе трехмерного массива для чтения и записи заданного элемента:

class TShortintSpaceXYZ {
    Q_PROPERTY(qint8 Item READ GetItem WRITE SetItem)
private:
    qint8 *FData;
    bool CheckIndex(int X, int Y, int Z);
public:
    TShortintSpaceXYZ();
    TShortintSpaceXYZ(int X, int Y, int Z);
    ~TShortintSpaceXYZ();                     
    int FX, FY, FZ;
    qint8 GetItem(int X, int Y, int Z);
    bool  SetItem(int X, int Y, int Z, qint8 Val);
};


При такой записи компилятор MinGW  ругается 3 раза:

"expected ',' or '...' before 'READ' "
"ISO C++ forbids declaration of Q_PROPERTY with no type [-fpermissive]"
"expected ';' at end of member declaration"

Что я делаю не так?


Название: Re: Q_PROPERTY в классе трехмерного массива
Отправлено: gil9red от Март 16, 2015, 19:00
http://doc.qt.io/qt-5/properties.html
"To declare a property, use the Q_PROPERTY() macro in a class that inherits QObject."


Название: Re: Q_PROPERTY в классе трехмерного массива
Отправлено: alik от Март 16, 2015, 19:32
http://doc.qt.io/qt-5/properties.html
"To declare a property, use the Q_PROPERTY() macro in a class that inherits QObject."

В таком виде компилятор попускает

#include <QObject>

class TShortintSpaceXYZ
{
    Q_PROPERTY(qint8 Item READ GetItem WRITE SetItem)
private:
    qint8 *FData;
    bool CheckIndex(int X, int Y, int Z);
public:
    TShortintSpaceXYZ();
    TShortintSpaceXYZ(int X, int Y, int Z);    //constructor
    ~TShortintSpaceXYZ();                      //destructor
    int FX, FY, FZ;
    qint8 GetItem(int X, int Y, int Z);
    bool  SetItem(int X, int Y, int Z, qint8 Val);
    void FillWithValue(qint8 Val);
    bool CheckForValue(int Val, int MinCountPoints);
    bool MoveElemOnY(TShortintSpaceXYZ Space, int dy);
    bool Assign(TShortintSpaceXYZ SpCopy, TShortintSpaceXYZ SpImage);
    void Clear();
};


TShortintSpaceXYZ SpaceXYZ = TShortintSpaceXYZ(10,10,10);

Но обращаться к элементам массива SpaceXYZ[1,2,3] не получается !

"no match for opeator [] (operand types are 'TShortintSpaceXYZ' and 'int' "


Но



Название: Re: Q_PROPERTY в классе трехмерного массива
Отправлено: kuzulis от Март 16, 2015, 19:48
Код
C++ (Qt)
class TShortintSpaceXYZ : public QObject
{
   Q_OBJECT
public:
   TShortintSpaceXYZ(QObject *parent = 0);
}
 


Название: Re: Q_PROPERTY в классе трехмерного массива
Отправлено: alik от Март 17, 2015, 10:08
Код
C++ (Qt)
class TShortintSpaceXYZ : public QObject
{
   Q_OBJECT
public:
   TShortintSpaceXYZ(QObject *parent = 0);
}
 

   


Название: Re: Q_PROPERTY в классе трехмерного массива
Отправлено: __Heaven__ от Март 17, 2015, 10:17
В определении метода нужно
Код
C++ (Qt)
TShortintSpaceXYZ::TShortintSpaceXYZ(QObject *parent)
вместо
Код
C++ (Qt)
TShortintSpaceXYZ::TShortintSpaceXYZ()


Название: Re: Q_PROPERTY в классе трехмерного массива
Отправлено: Fregloin от Март 17, 2015, 11:05
а разве свойство property позволяет установить более одного параметра? сомневаюсь, как вы это в коде будете задавать?
тут лучше или через вызов метода set(int x, int y, int z), или переопределить оператор[][][] (не знаю можно лит такое сделать напрямую). на худой конец чеорез какой нить вертекс Vertex{x,y,z}.

что то типа

struct Vertex {int x,y,z};

class YourClass : public QObject
{
Q_PROPERTY (Vertex coordinate MEMBER p_coord WRITE setCoord)
...
};

Q_DECLARE_METATYPE(Vertex)



Название: Re: Q_PROPERTY в классе трехмерного массива
Отправлено: deMax от Март 18, 2015, 10:44
Хочу задействовать метод Q_PROPERTY в своем классе трехмерного массива для чтения и записи заданного элемента:
Насколько я понял:
Цитировать
Q_PROPERTY - нужен при создании плагинов для Дизайнера, т.е. чтобы описать уникальные свойства виджета собственной разработки. Тем самым пользователь, который будет использовать твой виджет в дизайнере сможет изменять эти свойства прямо в дизайнере. Свойства не объявленные таким макросом в Дизайнере не видны.
ИМХО, для вашего класса это совсем не нужно, тем более эта штука не избавляет от необходимости писать setValue, getValue...

p.s. ИМХО в данном случае лучше использовать структуру и обращаться к членам класса на прямую - никаких проверок x,y,z на вход и выход все равно не засунуть.

p.s.s. ИМХО нет смысла скрывать N полей класса и делать N функций на чтение и N функций на запись, если в эти функции проверку не засунуть (либо проверять нечего, либо эта проверка кроме потери производительности и нагромождения кода ничего не даст).