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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Q_PROPERTY в классе трехмерного массива  (Прочитано 4134 раз)
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"

Что я делаю не так?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Март 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."
Записан

alik
Гость
« Ответ #2 : Март 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' "


Но

Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Март 16, 2015, 19:48 »

Код
C++ (Qt)
class TShortintSpaceXYZ : public QObject
{
   Q_OBJECT
public:
   TShortintSpaceXYZ(QObject *parent = 0);
}
 
Записан

ArchLinux x86_64 / Win10 64 bit
alik
Гость
« Ответ #4 : Март 17, 2015, 10:08 »

Код
C++ (Qt)
class TShortintSpaceXYZ : public QObject
{
   Q_OBJECT
public:
   TShortintSpaceXYZ(QObject *parent = 0);
}
 

   
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Март 17, 2015, 10:17 »

В определении метода нужно
Код
C++ (Qt)
TShortintSpaceXYZ::TShortintSpaceXYZ(QObject *parent)
вместо
Код
C++ (Qt)
TShortintSpaceXYZ::TShortintSpaceXYZ()
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Март 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)

Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Март 18, 2015, 10:44 »

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

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

p.s.s. ИМХО нет смысла скрывать N полей класса и делать N функций на чтение и N функций на запись, если в эти функции проверку не засунуть (либо проверять нечего, либо эта проверка кроме потери производительности и нагромождения кода ничего не даст).
« Последнее редактирование: Март 20, 2015, 16:41 от deMax » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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