不幸的是你不能。QVariant::isNull
代码如下:
static bool isNull(const QVariant::Private *d)
{
switch(d->type) {
case QVariant::String:
return v_cast<QString>(d)->isNull();
case QVariant::Char:
return v_cast<QChar>(d)->isNull();
case QVariant::Date:
return v_cast<QDate>(d)->isNull();
case QVariant::Time:
return v_cast<QTime>(d)->isNull();
...
}
return d->is_null;
}
正如你所看到的,它明确地使用了isNull()
一些常见变量类型的函数,默认情况下它返回d->is_null
值。
d->is_null
是类的 D 指针的类成员,它QVariant
被初始化,true
但每次你给它赋值时QVariant
它变成false
:
inline void qVariantSetValue(QVariant &v, const T &t)
{
...
d.is_null = false;
...
}
因此,对于自定义类型,它将始终返回false
.
一种可能性(我不推荐)是子类化QVariant
并重新实现该isNull
功能。在此函数中,您可以检查类型是否为自定义,在这种情况下,您可以返回isNull
自定义类的函数的返回值,否则您应该返回QVariant::isNull
函数的返回值。
bool MyQVariant::isNull() const
{
if (QString(typeName()) == "MyCustomClass")
return value<MyCustomClass>().isNull();
return QVariant::isNull();
}
编辑
您使用子类 QVariant 的示例代码:
#include <QVariant>
#include <QDebug>
class Integer {
bool null;
int x;
public:
Integer() : null(true), x(0) {}
Integer(int x) : null(false), x(x) {}
int value() const {
return x;
}
bool isNull() const {
return null;
}
};
Q_DECLARE_METATYPE(Integer)
class MyQVariant : public QVariant
{
public:
MyQVariant(QVariant v) :
QVariant(v) {}
bool isNull() const
{
if (QString(typeName()) == "Integer")
return value<Integer>().isNull();
return QVariant::isNull();
}
};
int main(int argc, char *argv[])
{
Integer x(42);
Integer y(0);
Integer z;
qRegisterMetaType<Integer>("Integer");
MyQVariant v1(QVariant::fromValue(x));
MyQVariant v2(QVariant::fromValue(y));
MyQVariant v3(QVariant::fromValue(z));
qDebug() << x.isNull() << v1.isNull();
qDebug() << y.isNull() << v2.isNull();
qDebug() << z.isNull() << v3.isNull();
}
输出:
false false
false false
true true