Skip to content

Commit abfdb42

Browse files
committed
cxx-qt-lib: use a QVariantValue trait so that custom types can be used
Closes KDAB#395
1 parent 90309b3 commit abfdb42

36 files changed

+1344
-611
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
- Support for container types: `QSet<T>`, `QHash<K, V>`, `QMap<K, V>`, `QVector<T>`
2020
- Support for further types: `QModelIndex`, `QPersistentModelIndex`
2121

22+
### Changed
23+
24+
- `QVariant` now has a uses a `QVariantValue` trait for supported types, allowing custom types to be used with QVariant
25+
2226
### Fixed
2327

2428
- Support for generating correct C++ code for `Pin<T>` Rust types

crates/cxx-qt-lib-headers/include/qvariant.h

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
// SPDX-License-Identifier: MIT OR Apache-2.0
88
#pragma once
99

10+
#include <cstdint>
11+
1012
#include <QVariant>
1113

1214
#include <QColor>
@@ -31,54 +33,51 @@ struct rust::IsRelocatable<QVariant> : std::true_type
3133

3234
namespace rust {
3335
namespace cxxqtlib1 {
34-
35-
namespace types {
36-
37-
enum class QVariantType : uint8_t
38-
{
39-
Unsupported = 0,
40-
Bool = 1,
41-
F32 = 2,
42-
F64 = 3,
43-
I8 = 4,
44-
I16 = 5,
45-
I32 = 6,
46-
QColor = 7,
47-
QDate = 8,
48-
QDateTime = 9,
49-
QPoint = 10,
50-
QPointF = 11,
51-
QRect = 12,
52-
QRectF = 13,
53-
QSize = 14,
54-
QSizeF = 15,
55-
QString = 16,
56-
QTime = 17,
57-
QUrl = 18,
58-
U8 = 19,
59-
U16 = 20,
60-
U32 = 21,
61-
};
62-
63-
} // namespace types
36+
namespace qvariant {
6437

6538
template<typename T>
6639
QVariant
67-
qvariantInitFromT(T value)
40+
qvariantConstruct(const T& value) noexcept
6841
{
69-
return QVariant::fromValue(value);
42+
return QVariant::fromValue<T>(value);
7043
}
7144

72-
types::QVariantType
73-
qvariantType(const QVariant& variant);
74-
7545
template<typename T>
7646
T
77-
qvariantToT(const QVariant& variant)
47+
qvariantValue(const QVariant& variant) noexcept
7848
{
79-
Q_ASSERT(variant.canConvert<T>());
8049
return variant.value<T>();
8150
}
8251

52+
// Need to use a macro here as we can't template because the types
53+
// are always QVariant and bool. So then CXX can't decide which to use.
54+
#define CXX_QT_QVARIANT_CAN_CONVERT(name) \
55+
bool qvariantCanConvert##name(const QVariant& variant);
56+
57+
CXX_QT_QVARIANT_CAN_CONVERT(Bool)
58+
CXX_QT_QVARIANT_CAN_CONVERT(F32)
59+
CXX_QT_QVARIANT_CAN_CONVERT(F64)
60+
CXX_QT_QVARIANT_CAN_CONVERT(I8)
61+
CXX_QT_QVARIANT_CAN_CONVERT(I16)
62+
CXX_QT_QVARIANT_CAN_CONVERT(I32)
63+
CXX_QT_QVARIANT_CAN_CONVERT(I64)
64+
CXX_QT_QVARIANT_CAN_CONVERT(QColor)
65+
CXX_QT_QVARIANT_CAN_CONVERT(QDate)
66+
CXX_QT_QVARIANT_CAN_CONVERT(QDateTime)
67+
CXX_QT_QVARIANT_CAN_CONVERT(QPoint)
68+
CXX_QT_QVARIANT_CAN_CONVERT(QPointF)
69+
CXX_QT_QVARIANT_CAN_CONVERT(QRect)
70+
CXX_QT_QVARIANT_CAN_CONVERT(QRectF)
71+
CXX_QT_QVARIANT_CAN_CONVERT(QSize)
72+
CXX_QT_QVARIANT_CAN_CONVERT(QSizeF)
73+
CXX_QT_QVARIANT_CAN_CONVERT(QString)
74+
CXX_QT_QVARIANT_CAN_CONVERT(QTime)
75+
CXX_QT_QVARIANT_CAN_CONVERT(QUrl)
76+
CXX_QT_QVARIANT_CAN_CONVERT(U8)
77+
CXX_QT_QVARIANT_CAN_CONVERT(U16)
78+
CXX_QT_QVARIANT_CAN_CONVERT(U32)
79+
CXX_QT_QVARIANT_CAN_CONVERT(U64)
80+
81+
}
8382
}
8483
}

crates/cxx-qt-lib/build.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,30 @@ fn main() {
5151
"qstring",
5252
"qtime",
5353
"qurl",
54-
"qvariant",
54+
"qvariant/mod",
55+
"qvariant/qvariant_bool",
56+
"qvariant/qvariant_f32",
57+
"qvariant/qvariant_f64",
58+
"qvariant/qvariant_i8",
59+
"qvariant/qvariant_i16",
60+
"qvariant/qvariant_i32",
61+
"qvariant/qvariant_i64",
62+
"qvariant/qvariant_qcolor",
63+
"qvariant/qvariant_qdate",
64+
"qvariant/qvariant_qdatetime",
65+
"qvariant/qvariant_qpoint",
66+
"qvariant/qvariant_qpointf",
67+
"qvariant/qvariant_qrect",
68+
"qvariant/qvariant_qrectf",
69+
"qvariant/qvariant_qsize",
70+
"qvariant/qvariant_qsizef",
71+
"qvariant/qvariant_qstring",
72+
"qvariant/qvariant_qtime",
73+
"qvariant/qvariant_qurl",
74+
"qvariant/qvariant_u8",
75+
"qvariant/qvariant_u16",
76+
"qvariant/qvariant_u32",
77+
"qvariant/qvariant_u64",
5578
"qvector/qvector_bool",
5679
"qvector/qvector_f32",
5780
"qvector/qvector_f64",
@@ -111,7 +134,7 @@ fn main() {
111134
"qstring",
112135
"qtime",
113136
"qurl",
114-
"qvariant",
137+
"qvariant/qvariant",
115138
"qvector/qvector",
116139
];
117140
for cpp_file in cpp_files {

crates/cxx-qt-lib/src/types/qvariant.cpp

Lines changed: 0 additions & 107 deletions
This file was deleted.

0 commit comments

Comments
 (0)