[QT]QGridLayout动态显示成员实现。

思路:创建一个主布局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;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值