思路:创建一个主布局QGridLayout, 主布局下每一个单元是一个QWidget(需要双击或者其他实现可以继承),每一个继承的QWidget添加没一个单元所需要显示的内容,使用gridLayout->setContentsMargins()函数控制没一个单元的位置;
显示结果如下:
关键代码如下:
int iRow = 0;
int iColunm = 0;
if (m_qWidget->layout())
{
int itemCount = m_qWidget->layout()->count();
for (int i = itemCount - 1; i >= 0; i--)
{
QLayoutItem *item = m_qWidget->layout()->takeAt(i);
if (nullptr != item)
{
m_qWidget->layout()->removeWidget(item->widget());
delete item->widget();
delete item;
}
}
delete m_qWidget->layout();
}
if (listMembersInfo.isEmpty())
{
ERROR_LOG("【%s】The inputtinhg parameter is null.!", Q_FUNC_INFO);
return;
}
QGridLayout *gridLayout = new QGridLayout;
int iMemberCounts = listMembersInfo.size();
for (int i = 0; i < iMemberCounts; i++)
{
MyWidget *myWidget = new MyWidget(m_qWidget);
myWidget->setFixedSize(110, 140);
QLabel *labPic = new QLabel(myWidget);
QLabel *labName = new QLabel(myWidget);
QLabel *labId = new QLabel(myWidget);
QLabel *labPos = new QLabel(myWidget);
QPushButton *pEditButton = new QPushButton(myWidget);
QLabel *labNameContent = new QLabel(myWidget);
QLabel *labIdContent = new QLabel(myWidget);
QLabel *labPosContent = new QLabel(myWidget);
// 增加widget边框
myWidget->setStyleSheet("QWidget{border: 1px solid rgb(220, 220, 220); border-radius: 5px;}");
// 消除内部部件边框
labPic->setStyleSheet("border:0px;border-style:outset;padding:0px;margin:0px;font:12px Arial");
labName->setStyleSheet("border:0px;border-style:outset;padding:0px;margin:0px;font:12px Arial");
labId->setStyleSheet("border:0px;border-style:outset;padding:0px;margin:0px;font:12px Arial");
labPos->setStyleSheet("border:0px;border-style:outset;padding:0px;margin:0px;font:12px Arial");
labNameContent->setStyleSheet("border:0px;border-style:outset;padding:0px;margin:0px;font:12px Arial");
labIdContent->setStyleSheet("border:0px;border-style:outset;padding:0px;margin:0px;font:12px Arial");
labPosContent->setStyleSheet("border:0px;border-style:outset;padding:0px;margin:0px;font:12px Arial");
pEditButton->setStyleSheet("QPushButton{border-style: none;}"
"QPushButton:hover{background-color:lightgray; color: white;}"
"QPushButton:pressed{background-color:rgb(85, 170, 255); border-style: inset;}");
pEditButton->setFixedSize(25,25);
pEditButton->setIcon(QIcon(":/resource/secondimage/edit.png"));
// 设置圆形头像
QPixmap pixmapa(":/resource/secondimage/Header.jpg");
QPixmap pixmap(60,60);
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
QPainterPath path;
path.addEllipse(0, 0, 60, 60);
painter.setClipPath(path);
painter.drawPixmap(0, 0, 60, 60, pixmapa);
labPic->setPixmap(pixmap);
labPic->setScaledContents(true);
labPic->setGeometry(10,10,80,70);
labName->setGeometry(5,80,40,20);
labId->setGeometry(5,100,30,20);
labPos->setGeometry(5,120,30,20);
labNameContent->setGeometry(50,80,50,20);
labIdContent->setGeometry(50,100,50,20);
labPosContent->setGeometry(50,120,50,20);
pEditButton->move(85,0);
labName->setText("姓名:");
labId->setText("工号:");
labPos->setText("职位:");
labNameContent->setText(listMembersInfo.at(i).sUserName);
labIdContent->setText(listMembersInfo.at(i).sJobNumber);
labPosContent->setText(listMembersInfo.at(i).sLevel);
m_mapButtonToJobNum.insert(pEditButton,listMembersInfo.at(i).sJobNumber);
myWidget->m_pUserId = listMembersInfo.at(i).sJobNumber;
myWidget->m_pUserName = listMembersInfo.at(i).sUserName;
myWidget->m_pUserPosition = listMembersInfo.at(i).sLevel;
connect(pEditButton,&QPushButton::clicked,this,&EntryItem::slot_ResumeEntry);
if (m_slPersonInfo.size() < iMemberCounts)
{
m_slPersonInfo.append(listMembersInfo.at(i).sUserName + "|" +listMembersInfo.at(i).sJobNumber);
}
int iMaxColunm = iWidth/(110 + 10);
iColunm = i;
if (0 == iMaxColunm)
{
iMaxColunm = this->width()/(110 + 10);
iHeight = this->height() + 40;
}
if (i > iMaxColunm - 1)
{
iRow = i / iMaxColunm;
iColunm = i - iMaxColunm * iRow;
}
gridLayout->addWidget(myWidget, iRow, iColunm, 1, 1, Qt::AlignLeft | Qt::AlignTop);
gridLayout->setHorizontalSpacing(10);
gridLayout->setVerticalSpacing(10);
gridLayout->setContentsMargins(10, 10, iWidth - (110 + 10) * (i + 1), iHeight - (150 + 10 + 10) * (iRow + 1));
}
m_qWidget->setLayout(gridLayout);
return;