crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Свойства в общем и свойства QDateTimeEdit в частности
S@D}{U
  опции профиля:
сообщение 15.8.2009, 23:53
Сообщение #1


Новичок


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

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




Репутация:   0  


Доброго всем времени суток.

У меня возникла следующая проблема:
необходимо реализовать возможность отображение в виджете QDateEdit нулевой даты ,
т.е той для которой верно QDate().isNull();

Первым и естественным на мой взгляд решением было создать потомка который будет переопределять функции QString textFromDateTime
( const QDateTime & dateTime ) const;
и void setDate(const QDate & date);


В textFromDateTime добавить проверку даты на нулевое значение и при положительной проверке возвращать заданный текст заместо вызова конвертирования значения даты в текст определенного в потомке.
В setDate так же сделать проверку на нулевое значение и при положительном результате изменять свойство обьекта напрямую без каких либо проверок.Так как определенная по умолчанию функция
делает проверку на нулевое значение и если проверка положительна устанавливает дату в значение свойства minimumDate.

Но тут и начались сложности.
Например код :
qDebug()<<"DATE VALUE"<<endl<<date;
qDebug()<<"DATE PROP"<<endl<<property("date");
qDebug()<<"DATE SET"<<endl<<setProperty("date",date);
qDebug()<<"DATE PROP"<<endl<<property("date");


приводит к довольно любопытному выводу :
DATE VALUE
QDate("")
DATE PROP
QVariant(QDate, QDate("Сб янв 1 2000") )
DATE SET
true
DATE PROP
QVariant(QDate, QDate("Сб янв 1 2000") )

Т.е данные устанавливаются , но судя по всему устанавливаются слотом который определен в базовом классе, а не напрямую меняется значение указанного свойства.

Если кто нибудь знает как можно переключить функцию изменяющую свойство обьекта на другую
или хотя бы как решить данную задачу другим способом просьба поделиться ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.8.2009, 0:35
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


S@D}{U,
Цитата(S@D}{U @ 16.8.2009, 0:53) *
Если кто нибудь знает как можно переключить функцию изменяющую свойство обьекта на другую


может в классе наследнике в макросе Q_PROPERTY написать нужную функцию. или создать новое свойство?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
S@D}{U
  опции профиля:
сообщение 16.8.2009, 11:48
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(kwisp @ 16.8.2009, 1:35) *
может в классе наследнике в макросе Q_PROPERTY написать нужную функцию. или создать новое свойство?


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

А создание нового свойства равносильно переопределению всех функций класса и переписыванию всего кода с минимальными изменениями.

Овчинка не стоит выделки. С трудом вериться что разработчики Qt не предусмотрели возможность переопределения методов работы со свойствами, но в документации про ето не слово, как к примеру и про макросы Q_Q и Q_D которые широко используются в реализациях стандартных классов (ет так к слову :))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
S@D}{U
  опции профиля:
сообщение 28.8.2009, 21:30
Сообщение #4


Новичок


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

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




Репутация:   0  


Если кому интересно то все оказалось довольно просто.
В большинстве стандартных обьектов используется так называемый механизм d-указателей почитать про них можно здесь.Видимо это сделано для того чтобы люди с не особо прямыми руками меньше лазали в ядро библиотеки или просто чтоб удобней было писать ;)
Сам макрос Q_PROPERTY никаких данных не создает а только описывает способ доступа к ним.
В моём случае доступ к дате можно было получить так :
...
#include <QDateEdit>
#include <../src/gui/widgets/qdatetimeedit_p.h>
#include <../src/corelib/tools/qdatetimeedit_p.h>
...
Q_D(QDateTimeEdit);
d->date=QDate();
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Роман_*
сообщение 11.9.2009, 21:32
Сообщение #5





Гости








    


К сожалению, не являюсь, пока, большим знатоком Qt...

Если вас не затруднит, приведите пожалуйста полный листинг переопределенного класса QDateEdit c пустой датой.

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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