Add USER properties to QDateEdit and QTimeEdit.

Both classes had such components before, but there were issues with
the NOTIFY signal not being in the same class as the Q_PROPERTY.

This patch solves that problem by using a signal of a different name.

Task-number: QTBUG-15731
Change-Id: Ibc7ce4dba8a6b88c05d62a90e14d0101c5cd3082
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
bb10
Stephen Kelly 2012-03-21 20:41:57 +01:00 committed by Qt by Nokia
parent e7a6dacf80
commit c3e1abad4e
6 changed files with 43 additions and 24 deletions

5
dist/changes-5.0.0 vendored
View File

@ -395,6 +395,11 @@ QtWidgets
* ResizeMode resizeMode(int logicalindex) const -
use sectionResizeMode(int logicalindex) instead.
* QDateEdit and QTimeEdit have re-gained a USER property. These were originally removed
before Qt 4.7.0, and are re-added for 5.0. This means that the userProperty for
those classes are now QDate and QTime respectively, not QDateTime as they have been
for the 4.7 and 4.8 releases.
QtNetwork
---------
* QHostAddress::isLoopback() API added. Returns true if the address is

View File

@ -555,18 +555,6 @@ void QItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) con
QVariant v = index.data(Qt::EditRole);
QByteArray n = editor->metaObject()->userProperty().name();
// ### Qt 5: remove
// A work-around for missing "USER true" in qdatetimeedit.h for
// QTimeEdit's time property and QDateEdit's date property.
// It only triggers if the default user property "dateTime" is
// reported for QTimeEdit and QDateEdit.
if (n == "dateTime") {
if (editor->inherits("QTimeEdit"))
n = "time";
else if (editor->inherits("QDateEdit"))
n = "date";
}
// ### Qt 5: give QComboBox a USER property
if (n.isEmpty() && editor->inherits("QComboBox"))
n = d->editorFactory()->valuePropertyName(v.userType());

View File

@ -492,18 +492,6 @@ void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &inde
QVariant v = index.data(Qt::EditRole);
QByteArray n = editor->metaObject()->userProperty().name();
// ### Qt 5: remove
// A work-around for missing "USER true" in qdatetimeedit.h for
// QTimeEdit's time property and QDateEdit's date property.
// It only triggers if the default user property "dateTime" is
// reported for QTimeEdit and QDateEdit.
if (n == "dateTime") {
if (editor->inherits("QTimeEdit"))
n = "time";
else if (editor->inherits("QDateEdit"))
n = "date";
}
// ### Qt 5: give QComboBox a USER property
if (n.isEmpty() && editor->inherits("QComboBox"))
n = d->editorFactory()->valuePropertyName(v.userType());

View File

@ -1549,6 +1549,7 @@ void QDateTimeEdit::mousePressEvent(QMouseEvent *event)
QTimeEdit::QTimeEdit(QWidget *parent)
: QDateTimeEdit(QDATETIMEEDIT_TIME_MIN, QVariant::Time, parent)
{
connect(this, SIGNAL(timeChanged(QTime)), SIGNAL(userTimeChanged(QTime)));
}
/*!
@ -1561,6 +1562,15 @@ QTimeEdit::QTimeEdit(const QTime &time, QWidget *parent)
{
}
/*!
\fn void QTimeEdit::userTimeChanged(const QTime &time)
This signal only exists to fully implement the time Q_PROPERTY on the class.
Normally timeChanged should be used instead.
\internal
*/
/*!
\class QDateEdit
@ -1603,6 +1613,7 @@ QTimeEdit::QTimeEdit(const QTime &time, QWidget *parent)
QDateEdit::QDateEdit(QWidget *parent)
: QDateTimeEdit(QDATETIMEEDIT_DATE_INITIAL, QVariant::Date, parent)
{
connect(this, SIGNAL(dateChanged(QDate)), SIGNAL(userDateChanged(QDate)));
}
/*!
@ -1615,6 +1626,15 @@ QDateEdit::QDateEdit(const QDate &date, QWidget *parent)
{
}
/*!
\fn void QDateEdit::userDateChanged(const QDate &date)
This signal only exists to fully implement the date Q_PROPERTY on the class.
Normally dateChanged should be used instead.
\internal
*/
// --- QDateTimeEditPrivate ---

View File

@ -205,17 +205,25 @@ private:
class Q_WIDGETS_EXPORT QTimeEdit : public QDateTimeEdit
{
Q_OBJECT
Q_PROPERTY(QTime time READ time WRITE setTime NOTIFY userTimeChanged USER true)
public:
QTimeEdit(QWidget *parent = 0);
QTimeEdit(const QTime &time, QWidget *parent = 0);
Q_SIGNALS:
void userTimeChanged(const QTime &time);
};
class Q_WIDGETS_EXPORT QDateEdit : public QDateTimeEdit
{
Q_OBJECT
Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY userDateChanged USER true)
public:
QDateEdit(QWidget *parent = 0);
QDateEdit(const QDate &date, QWidget *parent = 0);
Q_SIGNALS:
void userDateChanged(const QDate &date);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeEdit::Sections)

View File

@ -780,6 +780,9 @@ void tst_QItemDelegate::dateTimeEditor()
QTimeEdit *timeEditor = qFindChild<QTimeEdit *>(widget.viewport());
QVERIFY(timeEditor);
QCOMPARE(timeEditor->time(), time);
// The data must actually be different in order for the model
// to be updated.
timeEditor->setTime(time.addSecs(60));
widget.clearFocus();
qApp->setActiveWindow(&widget);
@ -791,6 +794,7 @@ void tst_QItemDelegate::dateTimeEditor()
QDateEdit *dateEditor = qFindChild<QDateEdit *>(widget.viewport());
QVERIFY(dateEditor);
QCOMPARE(dateEditor->date(), date);
dateEditor->setDate(date.addDays(60));
widget.clearFocus();
widget.setFocus();
@ -806,6 +810,12 @@ void tst_QItemDelegate::dateTimeEditor()
QVERIFY(dateTimeEditor);
QCOMPARE(dateTimeEditor->date(), date);
QCOMPARE(dateTimeEditor->time(), time);
dateTimeEditor->setTime(time.addSecs(600));
widget.clearFocus();
QVERIFY(item1->data(Qt::EditRole).userType() == QMetaType::QTime);
QVERIFY(item2->data(Qt::EditRole).userType() == QMetaType::QDate);
QVERIFY(item3->data(Qt::EditRole).userType() == QMetaType::QDateTime);
}
void tst_QItemDelegate::decoration_data()