Skip to content

Commit 6b3f07e

Browse files
committed
cxx-qt-lib: use a QVariantValue trait so that custom types can be used
Closes #395
1 parent 6892f82 commit 6b3f07e

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>`
2020
- Support for further types: `QModelIndex`
2121

22+
### Changed
23+
24+
- `QVariant` now has a uses a `QVariantValue` trait for supported types, this means custom types can be implemented
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
@@ -49,7 +49,30 @@ fn main() {
4949
"qstring",
5050
"qtime",
5151
"qurl",
52-
"qvariant",
52+
"qvariant/mod",
53+
"qvariant/qvariant_bool",
54+
"qvariant/qvariant_f32",
55+
"qvariant/qvariant_f64",
56+
"qvariant/qvariant_i8",
57+
"qvariant/qvariant_i16",
58+
"qvariant/qvariant_i32",
59+
"qvariant/qvariant_i64",
60+
"qvariant/qvariant_qcolor",
61+
"qvariant/qvariant_qdate",
62+
"qvariant/qvariant_qdatetime",
63+
"qvariant/qvariant_qpoint",
64+
"qvariant/qvariant_qpointf",
65+
"qvariant/qvariant_qrect",
66+
"qvariant/qvariant_qrectf",
67+
"qvariant/qvariant_qsize",
68+
"qvariant/qvariant_qsizef",
69+
"qvariant/qvariant_qstring",
70+
"qvariant/qvariant_qtime",
71+
"qvariant/qvariant_qurl",
72+
"qvariant/qvariant_u8",
73+
"qvariant/qvariant_u16",
74+
"qvariant/qvariant_u32",
75+
"qvariant/qvariant_u64",
5376
];
5477
for bridge in rust_bridges {
5578
println!("cargo:rerun-if-changed=src/types/{}.rs", bridge);
@@ -83,7 +106,7 @@ fn main() {
83106
"qstring",
84107
"qtime",
85108
"qurl",
86-
"qvariant",
109+
"qvariant/qvariant",
87110
];
88111
for cpp_file in cpp_files {
89112
builder.file(format!("src/types/{}.cpp", cpp_file));

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

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

0 commit comments

Comments
 (0)