QT中tableWidget批量添加item,添加图片并居中
有这样一个比起奇怪的需求,比较难描述,先看最终效果吧!
这里用到了QtableWidget表格,手动一个一个放太费劲了。
还有图片资源,还需要居中,确实研究了几个小时。还是在这记录一下。
直接上代码吧!都有注解的。
QPixmap Pic_R = QPixmap(":/back/PIC/redcircle.png");//添加红色的图片
Pic_R = Pic_R.scaled(40,40);//设置图片的大小
QPixmap Pic_G = QPixmap(":/back/PIC/greencircle.png");//添加绿色的图片
Pic_G = Pic_G.scaled(40,40);//设置图片的大小
//创建DI表格128路
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止修改
ui->tableWidget->verticalHeader()->setDefaultSectionSize(50);//行高50
ui->tableWidget->horizontalHeader()->setDefaultSectionSize(110);//列宽110
ui->tableWidget->verticalHeader()->setVisible(false);//不显示行标题
ui->tableWidget->horizontalHeader()->setVisible(false);//不显示列标题
ui->tableWidget->setColumnCount(16);//创建16行
ui->tableWidget->setRowCount(16);//创建16列
for(int i=0;i<16;i++)//赋予数据
{
for(int j=0;j<16;j+=2)//两列一组循环
{
QTableWidgetItem *name=new QTableWidgetItem();//定义一个表格元素的类
QString DI_Number = "通道"+QString::number(i*8+j/2+1);//定义一个字符串 要添加会变化的字符
name->setText(DI_Number);//赋予到表格元素中
ui->tableWidget->setItem(i,j,name);//显示到N行N列
ui->tableWidget->item(i,j)->setTextAlignment(Qt::AlignCenter);//设置文字居中
ui->tableWidget->item(i,j)->setBackground(QBrush(QColor(204,204,204)));//改变单元格颜色
QLabel *Label_LED = new QLabel();//定义一个QLabel类
Label_LED->setMaximumSize(110,50);//设置的大小,就是单元格的大小
if(DI_Table[i*8+j/2])//判断这一个是要红色还是绿色
Label_LED->setPixmap(Pic_G);//绿色的
else
Label_LED->setPixmap(Pic_R);//红色的
Label_LED->setAlignment(Qt::AlignCenter);//设置在QLabel中居中
ui->tableWidget->setCellWidget(i,j+1,Label_LED);//显示在N行N列
}
}
补充一下,之前一直走弯路,掉进去的几个坑。
- 图片居中的原理是:让图片类QPixmap固定大小,在QLabel里居中。如果不规定图片大小,会按照资源的大小显示,效果就是这样的了。
- 居中显示要使用Qt::AlignCenter,意思是水平垂直都居中。
在底层代码里是这个意思 AlignCenter = AlignVCenter | AlignHCenter - 其实Label_LED->setMaximumSize(110,50);是不需要的
不设置Label的大小,也是一样的效果。