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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Создание Q_PROPERTY  (Прочитано 14130 раз)
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);Непонимающий

Спасибо)
Записан
Rcus
Гость
« Ответ #1 : Апрель 16, 2009, 14:29 »

Реализация нужна. Переменная не всегда нужна. Если вы этого не понимаете, то свойства вам не нужны.
Записан
dr_Begemot
Гость
« Ответ #2 : Апрель 16, 2009, 14:35 »

Реализация нужна. Переменная не всегда нужна. Если вы этого не понимаете, то свойства вам не нужны.

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

Можно было бы и объяснить.
Записан
-QT-
Гость
« Ответ #3 : Апрель 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);
}
Записан
dr_Begemot
Гость
« Ответ #4 : Апрель 16, 2009, 16:44 »

Реализация нужна. Переменная не всегда нужна. Если вы этого не понимаете, то свойства вам не нужны.

Не могли бы вы пояснить почему переменная не всегда нужна? Что же тогда будет делать setShow?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Апрель 16, 2009, 16:46 »

Что захочет, то и будет. Как реализуешь. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Rcus
Гость
« Ответ #6 : Апрель 16, 2009, 16:53 »

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

Это у вас надо спрашивать что он будет делать Улыбающийся Самый простой случай это запись данных в настройки. Посложнее тоже можно придумать, но сперва нужно понять, нужны ли все-таки свойства Улыбающийся
Записан
ритт
Гость
« Ответ #7 : Апрель 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);
};

переменная оказалась не нужна Улыбающийся
доктор_бегемот, советую обратиться к закреплённой теме о литературе и выбрать книжечку по кутэ на свой вкус. и читать её, читать...
Записан
pethead
Гость
« Ответ #8 : Ноябрь 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-шные проперти ограничены использованием только для Объектных Испекторов?
или что сделано не так? как сделать что работало свойство как доступ к полю?
Записан
crackedmind
Гость
« Ответ #9 : Ноябрь 10, 2010, 17:50 »

Дяденька, вы документацию будете читать или нет?
Свойства доступны через функции setProperty & property класса QObject
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #10 : Ноябрь 10, 2010, 18:31 »

Цитировать
MyClass *myinstance = new MyClass;
 QObject *object = myinstance;

 myinstance->setPriority(MyClass::VeryHigh);
 object->setProperty("priority", "VeryHigh");
Записан
pethead
Гость
« Ответ #11 : Ноябрь 10, 2010, 18:39 »

читал, конечно, просто не понятно каков тогда смысл применения Q_PROPERTY.
это если я захочу написать Object Inspector разве только?
просто думал что применение может быть иным.
« Последнее редактирование: Ноябрь 10, 2010, 18:53 от pethead » Записан
BlackTass
Гость
« Ответ #12 : Ноябрь 10, 2010, 18:43 »

применение различное, начиная от банальной рефлексии и заканчивая использованием в QtScript и QML. Поэтому и спрашивали зачем в данном конкретном случае нужен ку_проперти
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #13 : Февраль 13, 2018, 22:22 »

читал, конечно, просто не понятно каков тогда смысл применения Q_PROPERTY.

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

Зачем нужен макрос Q_PROPERTY и как им пользоваться
Записан

Собираю информацию по крупицам
http://webhamster.ru
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #14 : Февраль 15, 2018, 13:14 »

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


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