crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Сохранение свойств виджета в Ui-файле
alexandr_ps
  опции профиля:
сообщение 9.2.2009, 10:28
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 9.2.2009
Пользователь №: 537

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.

Возникла следующая проблема. На форме используется собственный виджет, у которого есть свое свойство (property) отличное от свойств QWidget. Написан дополнительный диалог, который с помощью каких-то манипуляций формирует значение этого свойства (использовалось QDesignerTaskMenuExtension). Мне нужно чтобы значение этого свойства сохранялось в ui-файле, как и все другие свойства виджета. Вызов метода setProperty() меняет свойство только у объекта, ни в PropertyEditor'е в Designer'е, ни при сохранении в ui-файле изменение не происходит. В связи с этим вопрос, что делать? :)
Смотрю на QDesignerPropertySheetExtension, но этот класс позволяет переписать стандартный PropertyEditor(как я понял, если неправ - поправьте пожалуйста), а мне всего лишь нужно чтобы свойство сохранилось в ui-файле. Неужели нет других вариантов?

Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.2.2009, 20:00
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


А ты пример TicTacToe смотрел?
Я попробовал поменять свойства этого виджета в дизайнере, они сохраняются в ui-файле.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexandr_ps
  опции профиля:
сообщение 10.2.2009, 18:39
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 9.2.2009
Пользователь №: 537

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, пример натолкнул на решение. Позже отпишусь как это было :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexandr_ps
  опции профиля:
сообщение 11.2.2009, 13:38
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 9.2.2009
Пользователь №: 537

Спасибо сказали: 0 раз(а)




Репутация:   0  


В общем, может кому-то это тоже понадобится, поэтому привожу решение.
Как оказалось значение свойства записывается в ui-файл, если оно находится в PropertyEditor'е. Соответственно если вы хотите, чтобы ваше свойство сохранилось - вы должны добавить его в PropertyEditor, если его там нет, а затем поменять его значение на нужное вам.
В примере TicTacToe использовался вариант:
if (QDesignerFormWindowInterface *formWindow
             = QDesignerFormWindowInterface::findFormWindow(ticTacToe)) {
         formWindow->cursor()->setProperty("state", editor->state());
}

Но проблема в том, что у них в примере сохраняемое свойство - статическое, а мне хотелось чтобы оно было динамическим. Поэтому воспользовался такой конструкцией.
В конструкторе Extension'а получаю объекты классов расиширений:
propertySheet = qt_extension<QDesignerPropertySheetExtension*>(manager, widget);
dynamicPropertySheet = qt_extension<QDesignerDynamicPropertySheetExtension*>(manager, widget);

propertySheet - для работы со статическими свойствами, dynamicPropertySheet - с динамическими.
где manager - менеджер расширений QExtensionManager * , ну а widget - непосредственно сам виджет.

Ну а далее добавил 2 метода:
QString ConnectionsPluginTaskMenu::loadConnectionsProperty(){
    int index = propertySheet->indexOf(PROPERTY_NAME);
    QVariant value = propertySheet->property(index);
    return value.toString();
}
void ConnectionsPluginTaskMenu::saveConnectionsProperty(QString value){
    int index = propertySheet->indexOf(PROPERTY_NAME);
    if (index == -1) // нет свойства в ui-файле
        dynamicPropertySheet->addDynamicProperty(PROPERTY_NAME, value);
    else
        propertySheet->setProperty(index, value);
}

PROPERTY_NAME - имя property, в котором я сохраняю свою информацию
Кстати когда ваше динамическое свойство сохранится в файле, при загрузке файла сохраненное свойство будет уже статическим.
Вроде все работает.

P.S. Смущает только одна вещь - propertySheet = qt_extension<QDesignerPropertySheetExtension*>(manager, widget).
По документации функция qt_extension должна вернуть мне объект класс QDesignerPropertySheetExtension* или его наследника. Этот класс абстрактный, а описания его наследников я в доке на нашел. При этом у меня этот объект создается(!) и даже(!) запускает его функции, которые помечены как чисто виртуальные. В документации кстати тоже призывают так делать, в связи с чем вопрос как это все работает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.2.2025, 20:22