QVariant QVariantMap(List,Hash)


一、QVariant

QVariant可以存儲任意數據類型

如果要使自定義類型或其他非QMetaType內置類型在QVariant中使用,必須使用該宏Q_DECLARE_METATYPE,如果非QMetaType內置類型要在信號與槽中使用,必須使用qRegisterMetaType

轉載:qRegisterMetaType使用總結

1.構造函數

QVariant(bool b);
QVariant(double d);
QVariant(const QString &string);
QVariant(const QList<QVariant> &list);
//...所有Qt內置類型都支持,其他不再列舉

2.賦值

QVariant v1 = 12;
QVariant v2 = "test"; //v2類型為QString
QVariant v3;
v3.setValue(2.0f);

注意:自定義類型(包括std::string等)都需要使用setValue()賦值,不能直接使用構造函數和=賦值。

3.取值

在已知取值結果類型的前提下可以直接使用toInt()等函數

int toInt(bool* ok = Q_NULLPTR) const;
uint toUInt(bool* ok = Q_NULLPTR) const;
QList<QVariant> toList() const;
QPoint toPoint() const;
QRect toRect() const;
//Qt中定義的類型都支持,其他不再列舉

如果是自定義類型,或不知道取值結果的類型是什么,可以先使用canConvert<type>()判斷是否可以轉換

4.指針的存取

int arr[]{ 1,2,3 };
//保存
QVariant varP = QVariant::fromValue((void*)arr);
//獲取
int* r1 = (int*)varP.value<void*>();

QVariant v4; v4.setValue(r1); //此處不能用arr
auto* r2 = v4.value<int*>();

5.完整代碼示例

#include <QVariant>
#include <QDebug>
Q_DECLARE_METATYPE(std::string)
Q_DECLARE_METATYPE(int*)
int main()
{
	std::string str = "test";
	QVariant v1 = 12;
	QVariant v2; v2.setValue(str); //非Qt(C++)內置類型必須用setValue賦值
	//QVariant v2 = "test";  //此時的v2只能轉為QString,不能直接轉為std::string
	QVariant v3;
	v3.setValue(2.0f);
	auto val1 = v3.value<float>();
	auto val2 = v3.toFloat();

	bool can1 = v2.canConvert<float>();      //false
	bool can2 = v2.canConvert<std::string>();//true
	bool can3 = v2.canConvert<int>();        //false
	bool can4 = v2.canConvert<QString>();    //false

	auto val3 = v2.value<std::string>();

	int arr[]{ 1,2,3 };
	//保存
	QVariant varP = QVariant::fromValue((void*)arr);
	//獲取
	int* r1 = (int*)varP.value<void*>();

	QVariant v4; v4.setValue(r1); //此處不能用arr,因為arr是數組,不是int*
	auto* r2 = v4.value<int*>();

	qDebug("test");
	return 0;
}

二、QVariantMap

三、QVariantHash

四、QVariantList


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM