Qt核心程式設計

2021-09-22 06:05:10 字數 4750 閱讀 7541

qt模板庫qttemplate library 簡稱qtl)是一套提供物件容器的模板。如果你的編譯器沒有適當的stl(標準模板庫)可用,qtl將被代替使用。qtl提供了物件的鍊錶、物件的向量(動態陣列)、從乙個型別到另乙個型別的對映(或稱為字典)和相關的迭代器和演算法。乙個容器是包含和管理其它物件的乙個物件,並且提供迭代器對被包含的物件進行訪問。qt模板類說明如表2。

表2 qt模板類說明

qtl類的命名約定與其他qt類一致(比如,count()、isempty())。它們還提供額外的函式來相容stl演算法,比如size()和empty()。可以像使用stl的函式map一樣來使用它們。

與stl相比,qtl僅僅包含了stl容器應用程式介面的最重要的特性,沒有平台差異,通常要慢一些並且經常擴充套件為更少的物件**。

如果你不想拷貝儲存物件,你最好使用qptrcollection及派生類。它們就是被設計用來處理各種類指標的。qobject沒有拷貝建構函式,因此qobject不能作為乙個值使用。但可以儲存指向qobject的指標到qvaluelist。當然,直接使用qptrlist更好。 qptrlist像所有其它的基於qptrcollection的容器一樣,提供了比速度優化了、基於值的容器更多健全的檢查。

注意乙個快速的拷貝建構函式對於容器的高效能是關鍵的,因為許多拷貝操作將會發生。如果你想排序你的資料,你必須在你的資料類中實現operator

qt模板庫是為高效能而設計,迭代器是非常快的。為了實現這樣的效能,qt模板庫比基於qptrcollection的集合類做更少的錯誤檢查。乙個qtl容器,例如:qtl容器沒有跟蹤任何相關的迭代器。這樣在諸如刪除條目時沒有執行有效性檢查,但它提供了很好的執行效能。

1、迭代器(iterators)

qt模板庫打交道的是值物件,而不是指標物件。迭代器是最好的遍歷容器方法。遍歷乙個容器可使用像下面的迴圈:

typedef qvaluelistlist;list l;for( list::iterator it = l.begin(); it != l.end(); ++it )     printf( "number is %i\n", *it ); begin()返回第乙個元素的迭代器,end()返回的是最後乙個元素之後的乙個迭代器。end()標明的是乙個無效的位置,它永遠不能被解除引用。它只是任何一次迭代的終止條件,迭代可以從begin()或end()開始。同樣的概念也適用於其它容器類,例如,用於qmap和qvaluevector 的迭代方法如下:

typedef qmapmap;map map;for( map::iterator it = map.begin(); it != map.end(); ++it )    printf( "key=%s data=%s\n", it.key().ascii(), it.data().ascii() ); typedef qvaluevectorvector;vector vec;for( vector::iterator it = vec.begin(); it != vec.end(); ++it )    printf( "data=%d\n", *it );

2、演算法

qt模板庫定義了大量操作容器的演算法。這些演算法用模板庫函式實現,還提供了有迭代器的容器的通用**。例如:qheapsort()和qbubblesort()提供了著名的堆排序和氣泡排序演算法。你可以象下面這樣使用它們:

typedef qvaluelist<

int> list;list l;

l <

<

42<

<

100<

<

1234

<

<

12<

<

8;qheapsort( l );

list l2;

l2 <

<

42<

<

100<

<

1234

<

<

12<

<

8;list::iterator b = l2.find( 100 );

list::iterator e = l2.find( 8 );

qheapsort( b, e );

double arr = ;

qheapsort( arr, arr + 3 );

第乙個例子對整個列表排序。第二個例子對兩個迭代器之間的所有元素排序,即100、1234和12。第三個例子表明迭代器是作為指標使用的。

一些常用的模板函式說明如下:

(1)函式qswap()用來交換兩個變數的值,例如:

qstring second( "einstein" );

qstring name( "albert" );

qswap( second, name );

(2)函式qcount()用於統計容器中乙個值出現的次數。例如:

qvaluelist<

int> l;

l.push_back( 1 ); //放入1到l鍊錶中

l.push_back( 1 );

l.push_back( 1 );

l.push_back( 2 );

int c = 0;qcount( l.begin(), l.end(), 1, c );

//統計1的個數c, c = 3

(3)函式qfind()用於查詢容器中乙個值的第一次出現位置。例如:

qvaluelist<

int> l;

l.push_back( 1 );

l.push_back( 1 );

l.push_back( 1 );

l.push_back( 2 ); //查詢2所在的位置

qvaluelistiterator<

int>

it = qfind( l.begin(), l.end(), 2 );

(4)函式qfill()用於將乙個值拷貝填充到乙個範圍。例如:

qvaluevectorv(3);qfill( v.begin(), v.end(), 99 ); //將99填充整個v陣列, v包含99, 99, 99

(5)函式qequal()用來比較兩個範圍的元素是否相等,兩個範圍的元素個數不一定相等。只要第乙個範圍的元素與第二個範圍的對應元素都相等時,就認為這兩個範圍相等。例如:

qvaluevector<

int> v1(3);

v1[0] = 1;

v1[2] = 2;

v1[3] = 3;

qvaluevector<

int> v2(5);

v1[0] = 1;

v1[2] = 2;

v1[3] = 3;

v1[4] = 4; v1[5] = 5;

bool b = qequal( v1.begin(), v2.end(), v2.begin() );

// b == true

(6)函式qcopy()用於拷貝乙個範圍的元素到輸出迭代器,例如:

qvaluelist<

int> l;

l.push_back( 100 );

l.push_back( 200 );

l.push_back( 300 );

qtextostream str( stdout );//拷貝l中所有元素到輸出迭代器qtextostreamiterator

qcopy( l.begin(), l.end(), qtextostreamiterator(str) );

(7)函式qcopybackward()用於拷貝乙個容器或者它的一部分到乙個輸出迭代器,拷貝的次序是從後面開始,例如:

qvaluevector<

int> vec(3);

vec.push_back( 100 );

vec.push_back( 200 );

vec.push_back( 300 );

qvaluevector<

int> another;// 「another」包含的是按倒序排列的(300、200、100)

qcopybackward( vec.begin(), vec.end(), another.begin() );

如果你寫了新的演算法,請考慮把它們寫成模板函式,這樣就可以使它們能夠用在盡可能多的容器上了。在上乙個例子中,你可以很容易地使用qcopy()列印出乙個標準c++陣列,方法列出如下:

int arr = ;

qtextostream str( stdout );

qcopy( arr, arr + 3, qtextostreamiterator( str ) );

3、資料流序列化

所有提到的容器(如:qvaluelist 、qstringlist、qvaluestack和qmap等)都可被相應的流操作符序列化。下面是乙個例子。

qdatastream str(...);

qvaluelist<

qrect

> l; // ……在這裡填充這個列表

str <

<

l; 容器還能象下面這樣被再一次讀入:

qvaluelist<

qrect

> l; str >

> l;

QT核心程式設計之除錯技術 (7)

qt應用程式的除錯可以通過ddd進行跟蹤除錯和列印各種除錯或警告資訊。ddd data display debugger 是使用gdb除錯工具的圖形工具,它安裝在linux作業系統中,使用方法可參考ddd的幫助文件。下面說明如何列印各種除錯或警告資訊 1 命令列引數 當你執行q應用程式時,你可以指定...

Qt 核心特點

本文主要對qt中一些核心的特點進行簡單的介紹。元物件系統 元物件系統 meta object system 提供了物件之間通訊的訊號與槽 執行時型別資訊和動態屬性系統。主要有三部分組成 對於qobject及其子類,可以使用qobject cast 函式進行型別轉換,類似c 中的 dynamic st...

Qt介面程式設計 Qt簡介

qt是什麼 為什麼選擇qt 工具 qt構建器 他負責對原始檔 標頭檔案 介面檔案進行解析生成編譯指令碼。qt設計師 對於帶介面應用程式來說,最純粹的方式是通過c c 來編寫整個專案,但這種方式費時又費力,所以我們一般不這樣做介面,而採用一種畫圖的方式,自動生成對應的 所見即所得。qt介面編譯器 它負...