Russian Qt Forum

Qt => Общие вопросы => Тема начата: dr_Begemot от Апрель 16, 2009, 14:20



Название: Создание Q_PROPERTY
Отправлено: dr_Begemot от Апрель 16, 2009, 14:20
Прочитав мануал по Qt так ничего и не понял про Q_PROPERTY...

Допустим есть класс:
Код:
class MyProperty : public QObject
{
Q_OBJECT
Q_PROPERTY(bool show READ show WRITE setShow)
public:
MyProperty(QObject *parent = 0);

bool show() const;

public slots:
void setShow(bool on);
signals:
void showChanged(bool on);
}

И это все что требуется? никаких объявлений bool m_show в приватной части?
Дальше... требуется ли реализация функций    bool show() const; и void setShow(bool on);???
У меня без них не компилится. пишет "unresolved external symbol"

хорошо, написал реализацию, но откуда взять переменную, которую возвращать и которой присваивать новое значение?
как должна выглядеть реализация bool show() const; и void setShow(bool on);???

Спасибо)


Название: Re: Создание Q_PROPERTY
Отправлено: Rcus от Апрель 16, 2009, 14:29
Реализация нужна. Переменная не всегда нужна. Если вы этого не понимаете, то свойства вам не нужны.


Название: Re: Создание Q_PROPERTY
Отправлено: dr_Begemot от Апрель 16, 2009, 14:35
Реализация нужна. Переменная не всегда нужна. Если вы этого не понимаете, то свойства вам не нужны.

гм... странная связь: если не понимаете - то вам не нужно...

Можно было бы и объяснить.


Название: Re: Создание Q_PROPERTY
Отправлено: -QT- от Апрель 16, 2009, 16:35
Код
C++ (Qt)
class MyProperty : public QObject
{
Q_OBJECT
Q_PROPERTY(bool show READ show WRITE setShow)
public:
MyProperty(QObject *parent = 0);
 
bool show() const;
 
public slots:
void setShow(bool on);
 
private:
      bool show;
signals:
void showChanged(bool on);
}


Название: Re: Создание Q_PROPERTY
Отправлено: dr_Begemot от Апрель 16, 2009, 16:44
Реализация нужна. Переменная не всегда нужна. Если вы этого не понимаете, то свойства вам не нужны.

Не могли бы вы пояснить почему переменная не всегда нужна? Что же тогда будет делать setShow?


Название: Re: Создание Q_PROPERTY
Отправлено: Пантер от Апрель 16, 2009, 16:46
Что захочет, то и будет. Как реализуешь. :)


Название: Re: Создание Q_PROPERTY
Отправлено: Rcus от Апрель 16, 2009, 16:53
Не могли бы вы пояснить почему переменная не всегда нужна? Что же тогда будет делать setShow?

Это у вас надо спрашивать что он будет делать :) Самый простой случай это запись данных в настройки. Посложнее тоже можно придумать, но сперва нужно понять, нужны ли все-таки свойства :)


Название: Re: Создание Q_PROPERTY
Отправлено: ритт от Апрель 26, 2009, 02:29
Код:
class MyProperty : public QObject
{
Q_OBJECT
Q_PROPERTY(bool show READ show WRITE setShow)
public:
MyProperty(QObject *parent = 0);
 
bool show() const
        { return false; }
 
public slots:
void setShow(bool on)
        { emit showChanged(on); }

signals:
void showChanged(bool on);
};

переменная оказалась не нужна :)
доктор_бегемот, советую обратиться к закреплённой теме о литературе и выбрать книжечку по кутэ на свой вкус. и читать её, читать...


Название: Re: Создание Q_PROPERTY
Отправлено: pethead от Ноябрь 10, 2010, 17:31
Q_PROPERTY слишком смахивает не дельфовые Published property (для доступа к полям через RTTI на примере Object Inspector)
вот только в Qt почему то нет доступа через q_проперти к полю.

Код:
class Cloud : public QObject, public QGraphicsItem
{
    Q_OBJECT
    Q_INTERFACES(QGraphicsItem)

    Q_PROPERTY(QString Name READ name WRITE setName DESIGNABLE true USER true)
   

public:
    Cloud(QGraphicsItem *parent = 0, QGraphicsScene *scene = 0);
    ~Cloud();

QString name() const {return m_name;}
void setName(const QString& name);

    QRectF boundingRect() const;
    void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *);
    QPainterPath shape() const;

private:
QString m_name;

};
...
//применение
Cloud *cloud = new Cloud();
cloud->Name="myName";

ругается
error C2039: 'Name' : is not a member of 'Cloud'

вопрос: qt-шные проперти ограничены использованием только для Объектных Испекторов?
или что сделано не так? как сделать что работало свойство как доступ к полю?


Название: Re: Создание Q_PROPERTY
Отправлено: crackedmind от Ноябрь 10, 2010, 17:50
Дяденька, вы документацию будете читать или нет?
Свойства доступны через функции setProperty & property класса QObject


Название: Re: Создание Q_PROPERTY
Отправлено: Авварон от Ноябрь 10, 2010, 18:31
Цитировать
MyClass *myinstance = new MyClass;
 QObject *object = myinstance;

 myinstance->setPriority(MyClass::VeryHigh);
 object->setProperty("priority", "VeryHigh");


Название: Re: Создание Q_PROPERTY
Отправлено: pethead от Ноябрь 10, 2010, 18:39
читал, конечно, просто не понятно каков тогда смысл применения Q_PROPERTY.
это если я захочу написать Object Inspector разве только?
просто думал что применение может быть иным.


Название: Re: Создание Q_PROPERTY
Отправлено: BlackTass от Ноябрь 10, 2010, 18:43
применение различное, начиная от банальной рефлексии и заканчивая использованием в QtScript и QML. Поэтому и спрашивали зачем в данном конкретном случае нужен ку_проперти


Название: Re: Создание Q_PROPERTY
Отправлено: xintrea от Февраль 13, 2018, 22:22
читал, конечно, просто не понятно каков тогда смысл применения Q_PROPERTY.

Вот небольшая пояснялка по этой теме:

Зачем нужен макрос Q_PROPERTY и как им пользоваться (https://webhamster.ru/mytetrashare/index/mtb0/15185467018b3cxfk5fk)


Название: Re: Создание Q_PROPERTY
Отправлено: Day от Февраль 15, 2018, 13:14
Цитировать
Не могли бы вы пояснить почему переменная не всегда нужна?
Вот пришел в голову такой (надуманный) пример. Пусть у вас в классе есть переменная Numb и свойство Even (четное ли оно) Метод bool even() очевиден { return Numb%2 == 0; } А вот setEven(bool) можно реализовать по разному (примеры реализации придумайте сам).
Итого: Свойство есть - переменной, ему соответствующей нет!


Название: Re: Создание Q_PROPERTY
Отправлено: Day от Февраль 15, 2018, 13:32
Цитировать
каков тогда смысл применения
Вообще-то никто не заставляет. Не хочешь (не видишь смысла) - не применяй. Сеттеры - геттеры чаще всего вполне могут заменить property - setProperty. Я вот этой кухни не применяю - не вижу пока резона. Но свойства очень удобно использовать в другом смысле. Их можно СОЗДАВАТЬ. То есть дополнять уже существующий стандартный класс новыми данными (переменными). Если бы этого механизма не было, по каждой ерунде пришлось бы наследоваться.