青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Cpper
C/C++高級(jí)工程師 Android高級(jí)軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語(yǔ)言 程序猿
QVariant是一種可以存儲(chǔ)不同類(lèi)型的數(shù)據(jù)結(jié)構(gòu),在很多場(chǎng)合這是很有用得
為了達(dá)到這種目的,可以想象,該對(duì)象應(yīng)該存儲(chǔ)對(duì)象的類(lèi)型信息,數(shù)據(jù)信息以及其他輔助詳細(xì)
考慮用途,這種對(duì)象必須支持對(duì)不同對(duì)象的存儲(chǔ),對(duì)存儲(chǔ)類(lèi)型的檢測(cè)以及取對(duì)象三個(gè)功能
1.對(duì)象的存儲(chǔ)
代碼見(jiàn)下:
    QVariant(Type type);
    QVariant(
int typeOrUserType, const void *copy);
    QVariant(
int typeOrUserType, const void *copy, uint flags);
    QVariant(
const QVariant &other);

#ifndef QT_NO_DATASTREAM
    QVariant(QDataStream 
&s);
#endif

    QVariant(
int i);
    QVariant(
uint ui);
    QVariant(qlonglong ll);
    QVariant(qulonglong ull);
    QVariant(
bool b);
    QVariant(
double d);
    QVariant(
float f) { d.is_null = false; d.type = QMetaType::Float; d.data.f = f; }
#ifndef QT_NO_CAST_FROM_ASCII
    QT_ASCII_CAST_WARN_CONSTRUCTOR QVariant(
const char *str);
#endif

    QVariant(
const QByteArray &bytearray);
    QVariant(
const QBitArray &bitarray);
    QVariant(
const QString &string);
    QVariant(
const QLatin1String &string);
    QVariant(
const QStringList &stringlist);
    QVariant(
const QChar &qchar);
    QVariant(
const QDate &date);
    QVariant(
const QTime &time);
    QVariant(
const QDateTime &datetime);
    QVariant(
const QList<QVariant> &list);
    QVariant(
const QMap<QString,QVariant> &map);
    QVariant(
const QHash<QString,QVariant> &hash);
#ifndef QT_NO_GEOM_VARIANT
    QVariant(
const QSize &size);
    QVariant(
const QSizeF &size);
    QVariant(
const QPoint &pt);
    QVariant(
const QPointF &pt);
    QVariant(
const QLine &line);
    QVariant(
const QLineF &line);
    QVariant(
const QRect &rect);
    QVariant(
const QRectF &rect);
#endif
    QVariant(
const QUrl &url);
    QVariant(
const QLocale &locale);
#ifndef QT_NO_REGEXP
    QVariant(
const QRegExp &regExp);
#endif
#ifndef QT_BOOTSTRAPPED
    QVariant(
const QEasingCurve &easing);
#endif
    QVariant(Qt::GlobalColor color);
2.QVariant Type
在該對(duì)象中type負(fù)責(zé)記錄對(duì)象的類(lèi)型,這對(duì)于正確取出對(duì)象是很用得
3.成員函數(shù)
  Type type() const;
    
int userType() const;
    
const char *typeName() const;

    
bool canConvert(Type t) const;
    
bool convert(Type t);

#ifdef QT3_SUPPORT
    inline QT3_SUPPORT 
bool canCast(Type t) const
    { 
return canConvert(t); }
    inline QT3_SUPPORT 
bool cast(Type t)
    { 
return convert(t); }
#endif
這幾個(gè)函數(shù)的用途很顯然,看看其中一個(gè)的實(shí)現(xiàn)吧
bool QVariant::canConvert(Type t) const
{
    
//we can treat floats as double
    
//the reason for not doing it the "proper" way is that QMetaType::Float's value is 135,
    
//which can't be handled by qCanConvertMatrix
    
//In addition QVariant::Type doesn't have a Float value, so we're using QMetaType::Float
    const uint currentType = ((d.type == QMetaType::Float) ? QVariant::Double : d.type);
    
if (uint(t) == uint(QMetaType::Float)) t = QVariant::Double;

    
if (currentType == uint(t))
        
return true;

    
if (currentType > QVariant::LastCoreType || t > QVariant::LastCoreType) {
        
switch (uint(t)) {
        
case QVariant::Int:
            
return currentType == QVariant::KeySequence
                   
|| currentType == QMetaType::ULong
                   
|| currentType == QMetaType::Long
                   
|| currentType == QMetaType::UShort
                   
|| currentType == QMetaType::UChar
                   
|| currentType == QMetaType::Char
                   
|| currentType == QMetaType::Short;
        
case QVariant::Image:
            
return currentType == QVariant::Pixmap || currentType == QVariant::Bitmap;
        
case QVariant::Pixmap:
            
return currentType == QVariant::Image || currentType == QVariant::Bitmap
                              
|| currentType == QVariant::Brush;
        
case QVariant::Bitmap:
            
return currentType == QVariant::Pixmap || currentType == QVariant::Image;
        
case QVariant::ByteArray:
            
return currentType == QVariant::Color;
        
case QVariant::String:
            
return currentType == QVariant::KeySequence || currentType == QVariant::Font
                              
|| currentType == QVariant::Color;
        
case QVariant::KeySequence:
            
return currentType == QVariant::String || currentType == QVariant::Int;
        
case QVariant::Font:
            
return currentType == QVariant::String;
        
case QVariant::Color:
            
return currentType == QVariant::String || currentType == QVariant::ByteArray
                              
|| currentType == QVariant::Brush;
        
case QVariant::Brush:
            
return currentType == QVariant::Color || currentType == QVariant::Pixmap;
        
case QMetaType::Long:
        
case QMetaType::Char:
        
case QMetaType::UChar:
        
case QMetaType::ULong:
        
case QMetaType::Short:
        
case QMetaType::UShort:
            
return qCanConvertMatrix[QVariant::Int] & (1 << currentType) || currentType == QVariant::Int;
        
default:
            
return false;
        }
    }

    
if(t == String && currentType == StringList)
        
return v_cast<QStringList>(&d)->count() == 1;
    
else
        
return qCanConvertMatrix[t] & (1 << currentType);
}
該函數(shù)作用是檢測(cè)存儲(chǔ)對(duì)象是否可以轉(zhuǎn)換為輸入類(lèi)型,具體實(shí)現(xiàn)很明了
4.QVariant對(duì)象的最后一個(gè)主要的功能就是到給定類(lèi)型的轉(zhuǎn)換
函數(shù)簇如下:
int toInt(bool *ok = 0const;
    
uint toUInt(bool *ok = 0const;
    qlonglong toLongLong(
bool *ok = 0const;
    qulonglong toULongLong(
bool *ok = 0const;
    
bool toBool() const;
    
double toDouble(bool *ok = 0const;
    
float toFloat(bool *ok = 0const;
    qreal toReal(
bool *ok = 0const;
    QByteArray toByteArray() 
const;
    QBitArray toBitArray() 
const;
    QString toString() 
const;
    QStringList toStringList() 
const;
    QChar toChar() 
const;
    QDate toDate() 
const;
    QTime toTime() 
const;
    QDateTime toDateTime() 
const;
    QList
<QVariant> toList() const;
    QMap
<QString, QVariant> toMap() const;
    QHash
<QString, QVariant> toHash() const;
其一個(gè)實(shí)現(xiàn)如下:
/*!
    \fn QTime QVariant::toTime() const

    Returns the variant as a QTime if the variant has type() \l Time,
    \l DateTime, or \l String; otherwise returns an invalid time.

    If the type() is \l String, an invalid time will be returned if
    the string cannot be parsed as a Qt::ISODate format time.

    \sa canConvert(), convert()
*/
QTime QVariant::toTime() 
const
{
    
return qVariantToHelper<QTime>(d, Time, handler);
}
使用了模板函數(shù):qVariantToHelper
5.關(guān)于qVariantToHelper
/*!
    \fn bool QVariant::isValid() const

    Returns true if the storage type of this variant is not
    QVariant::Invalid; otherwise returns false.
*/

template 
<typename T>
inline T qVariantToHelper(
const QVariant::Private &d, QVariant::Type t,
                          
const QVariant::Handler *handler, T * = 0)
{
    
if (d.type == t)
        
return *v_cast<T>(&d);

    T ret;
    handler
->convert(&d, t, &ret, 0);
    
return ret;
}
該函數(shù)根據(jù)對(duì)象信息和目標(biāo)類(lèi)型做轉(zhuǎn)換工作,如果二者類(lèi)型一致,則直接做轉(zhuǎn)換,否則交給函數(shù)handler->convert處理
6.關(guān)于Handler對(duì)象
    struct Handler {
        f_construct construct;
        f_clear clear;
        f_null isNull;
#ifndef QT_NO_DATASTREAM
        f_load load;
        f_save save;
#endif
        f_compare compare;
        f_convert convert;
        f_canConvert canConvert;
        f_debugStream debugStream;
    };
不過(guò)好像沒(méi)看出什么門(mén)道,那就繼續(xù)看看
其實(shí)際結(jié)構(gòu)為:
const QVariant::Handler qt_kernel_variant_handler = {
    construct,
    clear,
    isNull,
#ifndef QT_NO_DATASTREAM
    
0,
    
0,
#endif
    compare,
    convert,
    
0,
#if !defined(QT_NO_DEBUG_STREAM) && !defined(Q_BROKEN_DEBUG_STREAM)
    streamDebug
#else
    
0
#endif
};
再看其中 一個(gè)函數(shù)實(shí)現(xiàn)constuct
static void construct(QVariant::Private *x, const void *copy)
{
    x
->is_shared = false;

    
switch (x->type) {
    
case QVariant::String:
        v_construct
<QString>(x, copy);
        
break;
    
case QVariant::Char:
        v_construct
<QChar>(x, copy);
        
break;
    
case QVariant::StringList:
        v_construct
<QStringList>(x, copy);
        
break;
    
case QVariant::Map:
        v_construct
<QVariantMap>(x, copy);
        
break;
    
case QVariant::Hash:
        v_construct
<QVariantHash>(x, copy);
        
break;
    
case QVariant::List:
        v_construct
<QVariantList>(x, copy);
        
break;
    
case QVariant::Date:
        v_construct
<QDate>(x, copy);
        
break;
    
case QVariant::Time:
        v_construct
<QTime>(x, copy);
        
break;
    
case QVariant::DateTime:
        v_construct
<QDateTime>(x, copy);
        
break;
    
case QVariant::ByteArray:
        v_construct
<QByteArray>(x, copy);
        
break;
    
case QVariant::BitArray:
        v_construct
<QBitArray>(x, copy);
        
break;
#ifndef QT_NO_GEOM_VARIANT
    
case QVariant::Size:
        v_construct
<QSize>(x, copy);
        
break;
    
case QVariant::SizeF:
        v_construct
<QSizeF>(x, copy);
        
break;
    
case QVariant::Rect:
        v_construct
<QRect>(x, copy);
        
break;
    
case QVariant::LineF:
        v_construct
<QLineF>(x, copy);
        
break;
    
case QVariant::Line:
        v_construct
<QLine>(x, copy);
        
break;
    
case QVariant::RectF:
        v_construct
<QRectF>(x, copy);
        
break;
    
case QVariant::Point:
        v_construct
<QPoint>(x, copy);
        
break;
    
case QVariant::PointF:
        v_construct
<QPointF>(x, copy);
        
break;
#endif
    
case QVariant::Url:
        v_construct
<QUrl>(x, copy);
        
break;
    
case QVariant::Locale:
        v_construct
<QLocale>(x, copy);
        
break;
#ifndef QT_NO_REGEXP
    
case QVariant::RegExp:
        v_construct
<QRegExp>(x, copy);
        
break;
#endif
#ifndef QT_BOOTSTRAPPED
    
case QVariant::EasingCurve:
        v_construct
<QEasingCurve>(x, copy);
        
break;
#endif
    
case QVariant::Int:
        x
->data.i = copy ? *static_cast<const int *>(copy) : 0;
        
break;
    
case QVariant::UInt:
        x
->data.u = copy ? *static_cast<const uint *>(copy) : 0u;
        
break;
    
case QVariant::Bool:
        x
->data.b = copy ? *static_cast<const bool *>(copy) : false;
        
break;
    
case QVariant::Double:
        x
->data.d = copy ? *static_cast<const double*>(copy) : 0.0;
        
break;
    
case QMetaType::Float:
        x
->data.f = copy ? *static_cast<const float*>(copy) : 0.0f;
        
break;
    
case QMetaType::QObjectStar:
        x
->data.o = copy ? *static_cast<QObject *const*>(copy) : 0;
        
break;
    
case QVariant::LongLong:
        x
->data.ll = copy ? *static_cast<const qlonglong *>(copy) : Q_INT64_C(0);
        
break;
    
case QVariant::ULongLong:
        x
->data.ull = copy ? *static_cast<const qulonglong *>(copy) : Q_UINT64_C(0);
        
break;
    
case QVariant::Invalid:
    
case QVariant::UserType:
        
break;
    
default:
        
void *ptr = QMetaType::construct(x->type, copy);
        
if (!ptr) {
            x
->type = QVariant::Invalid;
        } 
else {
            x
->is_shared = true;
            x
->data.shared = new QVariant::PrivateShared(ptr);
        }
        
break;
    }
    x
->is_null = !copy;
}
繼續(xù)看v_construct
該函數(shù)模板實(shí)現(xiàn)和平臺(tái)有關(guān),其中一個(gè)平臺(tái)的實(shí)現(xiàn)如下:
template <class T>
inline 
void v_construct(QVariant::Private *x, const void *copy, T * = 0)
{
    
if (sizeof(T) > sizeof(QVariant::Private::Data)) {
        x
->data.shared = copy ? new QVariantPrivateSharedEx<T>(*static_cast<const T *>(copy))
                              : 
new QVariantPrivateSharedEx<T>;
        x
->is_shared = true;
    } 
else {
        
if (copy)
            
new (&x->data.ptr) T(*static_cast<const T *>(copy));
        
else
            
new (&x->data.ptr) T;
    }
}
這里主要是把傳入對(duì)象指針導(dǎo)入為本身的數(shù)據(jù)指針data.ptr

QVariant大致就這個(gè)樣子
posted on 2011-12-10 20:51 ccsdu2009 閱讀(4378) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): QT源碼分析
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情亚洲激情| 欧美精品成人一区二区在线观看| 国产精品美女一区二区在线观看| 亚洲一区二区动漫| 亚洲欧美激情视频在线观看一区二区三区 | 欧美在线视频全部完| 亚洲欧美日韩精品综合在线观看| 国产区在线观看成人精品| 久久久久久久久伊人| 免费看黄裸体一级大秀欧美| 日韩视频免费观看高清在线视频 | 欧美激情bt| 亚洲一区二区三区四区在线观看| 亚洲综合久久久久| 亚洲第一网站| 一区二区精品| 精品电影一区| 日韩一级大片在线| 国产一区二区视频在线观看| 亚洲国产日韩精品| 国产精品久久一区主播| 奶水喷射视频一区| 国产精品99一区二区| 老司机精品视频网站| 欧美人与性动交α欧美精品济南到| 午夜在线精品偷拍| 欧美99久久| 久久精品国产一区二区三| 欧美黑人一区二区三区| 久久精品免费| 国产精品第十页| 亚洲国产成人久久综合| 国产欧美精品va在线观看| 亚洲国产精品久久久久婷婷884 | 欧美在线观看视频在线| 欧美福利一区二区| 久久久欧美一区二区| 欧美小视频在线观看| 欧美激情第3页| 韩日成人在线| 亚洲在线成人| 亚洲一区二区三区国产| 欧美成人激情视频| 久久综合中文| 国产手机视频精品| 中文精品视频| 中文欧美字幕免费| 欧美精品国产精品日韩精品| 免费亚洲一区| 狠狠网亚洲精品| 香蕉视频成人在线观看 | 狠狠久久五月精品中文字幕| 亚洲午夜在线| 亚洲一区二区精品| 欧美日韩免费观看一区=区三区| 免费国产自线拍一欧美视频| 国产日韩欧美中文| 午夜精品久久| 欧美专区亚洲专区| 国产精品日韩专区| 妖精成人www高清在线观看| 日韩写真视频在线观看| 美女露胸一区二区三区| 欧美成人精品h版在线观看| 在线不卡中文字幕| 久久久久国产精品人| 久久免费精品视频| 亚洲电影免费在线| 老色鬼久久亚洲一区二区| 欧美va亚洲va日韩∨a综合色| 极品少妇一区二区| 男人的天堂亚洲在线| 亚洲国产精品ⅴa在线观看| 亚洲精品视频在线看| 欧美另类一区二区三区| 夜夜嗨一区二区| 亚洲欧美日韩在线综合| 国产精品影片在线观看| 久久爱www.| 免费欧美日韩国产三级电影| 亚洲精品视频免费观看| 欧美午夜视频在线| 香蕉尹人综合在线观看| 久久三级视频| 亚洲美女在线视频| 国产精品网站一区| 久久青青草原一区二区| 亚洲欧洲美洲综合色网| 亚洲亚洲精品在线观看 | 欧美激情在线观看| 一本色道88久久加勒比精品 | 亚洲少妇一区| 国产午夜精品一区理论片飘花 | 欧美一区二区三区免费视| 欧美福利视频一区| 亚洲欧美日韩在线观看a三区| 国产中文一区| 欧美日韩国产三区| 西瓜成人精品人成网站| 亚洲国语精品自产拍在线观看| 亚洲色无码播放| 伊人狠狠色j香婷婷综合| 欧美日韩四区| 久久国产一区二区| 99在线热播精品免费| 久久一区中文字幕| 99视频精品免费观看| 国产一区视频观看| 欧美三日本三级少妇三2023 | 久久性天堂网| 亚洲欧美区自拍先锋| 91久久久一线二线三线品牌| 久久一区二区三区四区| 午夜国产不卡在线观看视频| 亚洲国产专区校园欧美| 国产亚洲精品bt天堂精选| 欧美日本国产一区| 美女精品视频一区| 久久精品一二三区| 亚洲欧美美女| 亚洲午夜高清视频| 日韩视频免费在线| 亚洲福利av| 欧美成人精品三级在线观看| 久久精彩免费视频| 亚洲欧美日韩专区| 一区二区av在线| 亚洲欧洲视频| 亚洲人成在线播放| 亚洲黄色性网站| 精品99一区二区三区| 国产一区激情| 国产亚洲精品v| 国产有码一区二区| 国产欧美日韩在线播放| 国产精品三级视频| 国产精品久在线观看| 国产精品福利av| 国产精品护士白丝一区av| 欧美体内she精视频| 欧美日韩一区二区三区免费| 欧美日韩免费高清| 欧美色另类天堂2015| 欧美午夜美女看片| 国产精品乱人伦中文| 国产精品色午夜在线观看| 欧美视频不卡| 国产精品一区久久久| 国产日韩欧美91| 国产一区二区成人| 一区精品久久| 亚洲人午夜精品| 亚洲精品视频在线看| 一区二区三区精品在线| 亚洲综合视频1区| 久久久久国产一区二区| 篠田优中文在线播放第一区| 欧美一级夜夜爽| 久久久免费av| 欧美成人精品| 国产精品久久一区主播| 国产午夜精品久久久| 亚洲成人直播| 一区二区三区成人| 欧美自拍偷拍| 欧美激情精品久久久久久大尺度| 亚洲精品乱码久久久久久久久| 亚洲最快最全在线视频| 欧美在线视频免费播放| 久热精品在线视频| 欧美日韩国产在线一区| 国产欧美欧美| 亚洲精品美女在线观看播放| 销魂美女一区二区三区视频在线| 久久久精品tv| 亚洲最新在线| 久久亚裔精品欧美| 国产精品久久99| 亚洲大片在线观看| 亚洲欧美国产视频| 欧美成人精品激情在线观看| 一本久道久久综合狠狠爱| 久久久精品tv| 国产精品免费观看视频| 亚洲国产精品成人精品| 亚洲在线播放| 老牛国产精品一区的观看方式| 亚洲最新中文字幕| 女同一区二区| 国产一区二区三区在线观看精品| 99视频有精品| 免费日韩精品中文字幕视频在线| 亚洲性xxxx| 欧美激情国产日韩精品一区18| 国内精品一区二区三区| 亚洲欧美制服另类日韩| 亚洲国产欧美一区二区三区久久| 久久激情五月激情| 国产精品一区在线观看你懂的| 一二三区精品福利视频|