最近做的一个项目中需要用到视觉去检测产品,产品呈矩阵式排列,客户那边需要检测完一组产品后能够将检测结果以图形化的方式显示出来。
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的值应该是一个数组的指针,这样才能有多个值传进来,还有矩阵的排列方式可有多种选择
效果如下:
原文地址:https://www.cnblogs.com/rogeryu1024/p/9999365.html
时间: 2024-10-23 04:17:11