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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Свойства в Qt  (Прочитано 8522 раз)
xTr1m
Гость
« : Декабрь 24, 2010, 11:22 »

День добрый, задался я таким вопросом: зачем в Qt есть свойства. В голову дельного ничего не приходит. Может это дань моде или красиво выглядит обращение и задание значение для объекта. Ведь по сути, это гораздо медленнее, нежели простое обращение к методу объекта. Может тут дело в кроссплатформенных вещах, о которых мне неведомо. В общем, прошу меня просветить. Большое спасибо =))
Записан
UVV
Гость
« Ответ #1 : Декабрь 24, 2010, 11:30 »

Что за свойство?
Если это простой член класса, то у него у каждого есть get/set методы, не переживай.
Записан
xTr1m
Гость
« Ответ #2 : Декабрь 24, 2010, 12:12 »

Я имел в виду вот эти свойства:
Q_PROPERTY(type name
            READ getFunction
            [WRITE setFunction]
            [RESET resetFunction]
            [DESIGNABLE bool]
            [SCRIPTABLE bool]
            [STORED bool])


и вот такое использование:
obj->setProperty("prop", true);

ведь можно сразу вызвать метод, который устанавливает поле "prop" в true
Записан
alexman
Гость
« Ответ #3 : Декабрь 24, 2010, 12:23 »

День добрый, задался я таким вопросом: зачем в Qt есть свойства.
QStateMachine юзает свойства, например.
Записан
xTr1m
Гость
« Ответ #4 : Декабрь 24, 2010, 12:25 »

кажется я нашел ответ на свой вопрос:

Цитировать
3) Макрос Q_PROPERTY позволяет в некоторых случаях избежать приведения. Пример:
class SomeClass : public QObject {
     Q_OBJECT
     Q_PROPERTY(bool prop READ prop WRITE setProp);
private:
     bool var;
public:
     SomeClass() : var(true) { }
     bool prop() const { return var; }
     void setProp(bool newValue) { var = newValue; }
};
//а теперь, имея указатель на QObject, мы можем изменять значения переменных унаследованного класса:
SomeClass *sc = new SomeClass;
QObject *obj = sc;
obj->setProperty("prop", true); //тоже самое, что и sc->setProp(true);

может есть еще интересные нюансы? =)
Записан
maxxant
Гость
« Ответ #5 : Декабрь 24, 2010, 12:28 »

В основном для упрощения работы с Qt скриптами. Ну и для чтения некой конфигурации из текстового файла, чтобы не парсить и сопоставлять методы вручную.
Записан
xTr1m
Гость
« Ответ #6 : Декабрь 24, 2010, 12:30 »

а можно вот тут вот
Цитировать
для чтения некой конфигурации из текстового файла, чтобы не парсить и сопоставлять методы вручную
пояснить или дать кусочек кода (хотя бы псевдо) для наглядности
Записан
JamS007
Гость
« Ответ #7 : Декабрь 24, 2010, 12:52 »

В уроках от самих троллей сказано, что свойства можно использовать еще и как теги для объектов. Свойства можно задавать на этапе выполнения:

Код
C++ (Qt)
bool ret = object->setProperty(name,value);

Пояснение троллей: True if the property has been defined using Q_PROPERTY. False if it is dynamically added.
Таким образом можно создавать множество тегов, в которых можно хранить информацию времени выполнения.

Ссылка на уроки от троллей. (L2 - урок про QObject и Property)
« Последнее редактирование: Декабрь 24, 2010, 12:58 от JamS007 » Записан
SASA
Гость
« Ответ #8 : Декабрь 24, 2010, 13:05 »

Свойства - это вещь.

Как я использую свойства.

1. "Полиморфизм". Есть много разных объектов. Интерфейсы у всех разные. Но есть свойства. Нам надо знать только ИМЯ свойства, чтоб с ним работать.
2. Настройка объекта. Смотри проперти браузер, в ку-те дизайнере.
3. Скрипты.

Вообщем, проперти, это часть метообъектной информации ку-те, очень мощной штуки.
Записан
maxxant
Гость
« Ответ #9 : Декабрь 24, 2010, 13:25 »

а можно вот тут вот
Цитировать
для чтения некой конфигурации из текстового файла, чтобы не парсить и сопоставлять методы вручную
пояснить или дать кусочек кода (хотя бы псевдо) для наглядности

вот простой пример, думаю будет понятно. делаем всё также как и здесь:
http://doc.qt.nokia.com/4.7/restoring-geometry.html
но только через свойства.
заменяем методы на такие:

Код:
void MainWindow::closeEvent(QCloseEvent *event)
{
    QSettings settings("MyCompany", "MyApp");

    settings.beginGroup("prop");
    settings.setValue( "geometry", geometry() );
    settings.endGroup();
    QMainWindow::closeEvent(event);
}

void MainWindow::readSettings()
{
    QSettings settings("MyCompany", "MyApp");

    settings.beginGroup("prop");
    QStringList prop_keys = settings.allKeys();
    while( prop_keys.size() )
    {
        QString key = prop_keys.takeFirst();
        setProperty( qPrintable(key), settings.value(key) );
    }
    settings.endGroup();
}

Геометрия окна также сохраняется и восстанавливается. Можно таким образом добавить кучу ключей и все они прочитаются в цикле автоматом.

Записан
xTr1m
Гость
« Ответ #10 : Декабрь 24, 2010, 13:40 »

Всем спасибо, свою безграмотность в этом вопросе я развеял )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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