Cập nhật
Tôi đã tạo một qt bugticket với hy vọng tài liệu sẽ được mở rộng.So sánh QVariant với các loại riêng đang hoạt động?
Câu hỏi gốc
Tin tưởng một Question from 2010 và Qt Documentation, các operator==()
không làm việc với các loại tùy chỉnh.
Trích:
bool QVariant :: operator == (const QVariant & v) const
So sánh QVariant này với
v
và trảtrue
nếu họ đều bình đẳng; nếu không trả vềfalse
.
QVariant
sử dụng toán tử bình đẳng của loại() nó chứa để kiểm tra tính bình đẳng.QVariant
sẽ cố gắngconvert()
v
nếu loại của nó không giống với loại của biến thể này. XemcanConvert()
để biết danh sách các chuyển đổi có thể có.Cảnh báo: Chức năng này không hỗ trợ các loại tùy chỉnh được đăng ký với
qRegisterMetaType()
.
Tôi đã cố gắng tạo lại trường hợp repro từ Stackoverflow Question from 2010 và so sánh đã hoạt động mà không gặp bất kỳ sự cố nào đối với tôi.
Tôi cũng đã tiến thêm một bước và thử so sánh bằng cách sử dụng một lớp học riêng cũng hoạt động hoàn hảo. Để tái sản xuất, đặt đoạn mã sau vào bất kỳ tiêu đề:
enum MyEnum { Foo, Bar };
Q_DECLARE_METATYPE(MyEnum)
class MyClass
{
int value;
public:
MyClass() : value(0)
{
}
MyClass(int a) : value(a)
{
}
bool operator==(const MyClass &) const
{
Q_ASSERT(false); // This method seems not to be called
return false;
}
bool operator!=(const MyClass &) const
{
Q_ASSERT(false); // This method seems not to be called
return true;
}
};
Q_DECLARE_METATYPE(MyClass)
Và đoạn mã sau vào bất kỳ chức năng:
QVariant var1 = QVariant::fromValue<MyEnum>(Foo);
QVariant var2 = QVariant::fromValue<MyEnum>(Foo);
Q_ASSERT(var1 == var2); // Succeeds!
var1 = QVariant::fromValue<MyEnum>(Foo);
var2 = QVariant::fromValue<MyEnum>(Bar);
Q_ASSERT(var1 != var2); // Succeeds!
QVariant obj1 = QVariant::fromValue<MyClass>(MyClass(42));
QVariant obj2 = QVariant::fromValue<MyClass>(MyClass(42));
Q_ASSERT(obj1 == obj2); // Succeeds!
obj1 = QVariant::fromValue<MyClass>(MyClass(42));
obj2 = QVariant::fromValue<MyClass>(MyClass(23));
Q_ASSERT(obj1 != obj2); // Succeeds!
Tôi đoán rằng trong các phiên bản qt mới hơn kích thước của một loại được mua lại khi Q_DECLARE_METATYPE
được sử dụng để QVariant có thể so sánh các giá trị của các loại không xác định trước đó.
Nhưng đó chỉ là phỏng đoán và tôi không muốn mạo hiểm tính ổn định của ứng dụng bằng cách đoán qt nào thay vì dựa vào tài liệu.
Tôi có thể tìm hiểu cách QVariant so sánh các loại không xác định không? Tôi muốn dựa vào đặc điểm kỹ thuật hơn là thực hiện.
bạn có gọi 'qRegisterMetaType()' trên 'MyEnum' và' MyClass'? – Zaiborg
Không, tôi không gọi 'qRegisterMetaType()'. Không có dòng mã nào sử dụng MyClass hoặc MyEnum ngoại trừ các dòng tôi đã đăng ở trên. –
bạn đã thử đưa các giá trị trở lại so với loại so sánh ban đầu của nó? ('QVariant :: value()') cũng là ví dụ kiểu 'var1'? (hoặc để được rõ ràng, những gì hiện các biến nói những gì loại nó là) –
Zaiborg