Хорошо, я нашел один способ сделать это.
Я создал родительский тип с именем CustomType с помощью виртуального метода, который я могу реализовать для преобразования моего пользовательского типа в «нормальный» QVariant:
class CustomType {
public:
virtual ~CustomType() {}
virtual QVariant toVariant() const { return QVariant(); }
};
Затем я унаследовал свой собственный класс Money от этого.
class Money : public CustomType {
public:
Money(double d) {
_value = d;
}
~Money() {}
QVariant toVariant() {
return QVariant(_value);
}
private:
double _value;
};
Это позволяет мне передавать свои собственные переменные Money, содержащиеся в QVariants, чтобы я мог использовать их в системе свойств Qt, каркасе модели / представления или модуле sql.
Но если мне нужно сохранить свою пользовательскую переменную Money в базе данных (используя QSqlQuery.addBindValue), это не может быть пользовательский класс, это должен быть известный тип (например, double).
QVariant myMoneyVariant = myqobject.property("myMoneyProperty");
void *myData = myMoneyVariant.data();
CustomType *custType = static_cast<CustomType*>(myData);
QVariant myNewVariant = ct->toVariant();
myNewVariant теперь имеет тип double, а не Money, поэтому я могу использовать его в базе данных:
myqsqlquery.addBindValue(myNewVariant);
или преобразовать его в строку:
QString s = myNewVariant.toString();