最近做的一個項目中需要用到視覺去檢測產品,產品呈矩陣式排列,客戶那邊需要檢測完一組產品后能夠將檢測結果以圖形化的方式顯示出來。
emmm,這個似乎不難,只需要有類似於數組的東西就可以搞定,不過對於數組來說它並不能存像QLabel這樣的類型,但是Qt它還是機制地提供了幾種容器類來幫我們儲存數據。Qt的容器類大概有以下幾類:
QList類(用得比較多的一種):QList、QLinkedList、QQueue
QVector類(將數據存儲在一段連續的內存空間里):QVector、QStack
QMap類(字典式容器,將Key類型的值映射到 T類型的值上):QMap、QHash
在這里也沒有什么復雜的操作,用最常用的QList就行了
接下來要思考一下整個過程應該是怎樣的呢?
首先要定義這樣一個函數,可以接收矩陣的行列值和檢測每個單元的狀態值,分別定義為row,col和status。接着要把所有的Label都給new一遍(廢話,沒有新label哪來的新zg,手動滑稽),因為生產的時候是有順序的,每個單元都有它的序號,所以這些催巴兒得按大小個排好,然后給它們分配好狀態值,最后再根據生產順序進行矩陣排列。
廢話不多說,上代碼
1 QList<QLabel *> m_lstLabel; 2 3 void Result::showResult(int row, int col, bool status) 4 { 5 int count = row*col; 6 for(int i = 0;i < count;i++) 7 { 8 QLabel *label = new QLabel; 9 label->setParent(this); 10 label->setGeometry(320,170,30,50); 11 if(status == true) 12 { 13 label->setStyleSheet("background-color:rgb(0,255,0)"); 14 } 15 else 16 { 17 label->setStyleSheet("background-color:rgb(255,0,0)"); 18 } 19 m_lstLabel.append(label); 20 } 21 22 for(int j = 0;j < col;j++) 23 { 24 for(int k = 0;k < row;k++) 25 { 26 m_lstLabel.at(k+row*j)->move(320-40*j,170-60*k); 27 } 28 } 29 }
這段代碼還有一些需要修改的地方,比如status的值應該是一個數組的指針,這樣才能有多個值傳進來,還有矩陣的排列方式可有多種選擇
效果如下:

