天天看點

Qt D-Bus的資料類型系統

前言:

衆所周知,在進階語言程式設計中繞不開的就是資料結構和資料類型,D-Bus就具有一個可擴充的類型系統,它是基于數組和基本資料類型的組合。可以通過QDBusArgument類實作自定義資料結構的的接口,它允許使用者通過總線發送和接收幾乎所有的C++資料類型。且Qt D-Bus對C++的基本資料類型進行了底層封裝,不需要自己實作基本資料類型的接口。本文根據Qt幫助文檔翻譯損益而成,具體細節可檢視Qt幫助文檔。

Qt與D-Bus基本資料類型對應表如下:

Qt 資料類型 D-Bus 等價類型
uchar BYTE
bool BOOLEAN
short INT16
ushort UINT16
int INT32
uint UINT32
qlonglong INT64
qulonglong UINT64
double DOUBLE
QString STRING
QDBusVariant VARIANT
QDBusObjectPath OBJECT_PATH
QDBusSignature SIGNATURE

注:除了基本類型之外,QDBusArgument本身還支援兩種非基本類型,因為它們在Qt應用程式中廣泛使用:QStringList和QByteArray

複合類型:

D-Bus指定了三種基本類型的聚合,允許建立複合類型。它們是數組、結構體和映射/字典。

數組是由相同類型的0個或多個元素組成的集合,而結構是由固定數量的元素組成的集合,每種元素都屬于任何類型。映射或字典被實作為一對元素的數組,是以在一個映射中可以有零個或多個元素。

擴充類型系統:

Qt允許使用者使用自定義資料結構,為此,Qt D-Bus提供了自動類型的擴充功能,要使用自己的Qt D-Bus類型,必須使用Q_DECLARE_METATYPE()宏聲明該類型為Qt元類型,并使用qDBusRegisterMetaType()函數注冊。流操作符>>和操作符<<将被注冊系統自動找到。Qt D-Bus為數組和映射提供專門化模闆,以便與Qt的容器類(如QMap和QList)一起使用,是以沒有必要為它們編寫流操作符函數。對于其他類型,特别是實作結構體的類型,必須顯式地實作操作符。

例:

struct MyStructure
{
    int count;
    QString name;
};
Q_DECLARE_METATYPE(MyStructure)

// 将MyStructure 資料編碼到 D-Bus argument中
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &mystruct)
{
    argument.beginStructure();
    argument << mystruct.count << mystruct.name;
    argument.endStructure();
    return argument;
}

// 從D-Bus argumentj解碼資料到MyStructure data 中
const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &mystruct)
{
    argument.beginStructure();
    argument >> mystruct.count >> mystruct.name;
    argument.endStructure();
    return argument;
}
           

注:通常的在使用自定義資料時,需要使用qDBusRegisterMetaType()注冊,例:qDBusRegisterMetaType<MyStructure>();

一旦注冊,該類型就可以用于傳出方法調用(放置在QDBusAbstractInterface::call()中)、接收來自注冊對象的信号發射或來自遠端應用程式的傳入調用中。需要注意的是,操作符<<和操作符>>流函數必須始終生成相同數量的條目,以防出現讀寫結構(編組和demarshalling),否則調用和信号可能開始無聲地失敗。

注:Qt D-Bus為常見容器提供了通用模闆來完成資料的編組工作,您不需要為它聲明一個操作符<< function,如:QList、QVector、QMap或QHash,STL的序列容器也是如此,例如std::list、std::vector等。

雖然,所有Qt D-Bus類型(基本類型和使用者定義的類似)都可以用于通過總線發送和接收所有類型的消息。但是不能使用上面清單之外的任何類型,包括列出的類型的typedefs。這還包括QList<QVariant>和QMap<QString,QVariant>。

PS:Qt幫助文檔是最好的教材

繼續閱讀