QTableWidget 添加 按钮、进度条、下拉框,以及处理事件

一 、 添加 按钮、进度条、下拉框

给  按钮 和 下拉框  添加信号和槽, 注意:每个控件都起个名字, 后面通过名字来查找控件。

pb->setObjectName(QStringLiteral("proBar"));   // 设置按钮名称
// 添加进度条
    QProgressBar *pb = new QProgressBar(this);
    pb->setObjectName(QStringLiteral("proBar"));   // 设置按钮名称
    pb->setMinimumHeight(20);
    pb->setFormat(QString("当前进度为:%1%").arg(0));
    pb->setValue(0);
    pb->setMaximum(100);
    pb->setMinimum(0);
    pb->setAlignment(Qt::AlignCenter);
    font.setPointSize(8);
    pb->setFont(font);

    pb->setStyleSheet(
                "QProgressBar {border: 2px solid grey;"
                "border-radius: 5px;"
                "color:#ff6600;"
                "background-color: #E9E9E9;"
                "text-align: center;}"
                "QProgressBar::chunk {background-color: rgb(0,250,0) ;}"
                );

    QWidget *wg = new QWidget(this);
    QHBoxLayout *verticalLayouts = new QHBoxLayout(wg);
    verticalLayouts->setObjectName(QString::fromUtf8("verticalLayouts"));
    verticalLayouts->setContentsMargins(5,0,5,0);
    verticalLayouts->setSpacing(0);
    verticalLayouts->addWidget(pb);
    ui->tableWidget->setCellWidget(rowNo,colPro,wg);

    // 下拉框
    QComboBox *cbox = new QComboBox(this);
    cbox->setObjectName(QStringLiteral("combox"));   // 设置按钮名称
    cbox->addItem(QIcon(":/ico/img/boy.png"),"男");
    cbox->addItem(QIcon(":/ico/img/girl.png"),"女");
    cbox->setCurrentText(strSex);
    // 设置文字居中
    cbox->setEditable(true);  // 变为可编辑状态
    cbox->lineEdit()->setAlignment(Qt::AlignCenter);   // 文字居中
    //    cbox->lineEdit()->setReadOnly(true);   // 改为只读状态

    connect(cbox,SIGNAL(currentIndexChanged(const QString &)), this,SLOT(comboBoxCurrentIndexChanged(const QString &)));  // 添加 下拉框 点击处理

    QWidget *wgc = new QWidget(this);
    QHBoxLayout *verticalLayoutc = new QHBoxLayout(wgc);
    verticalLayoutc->setObjectName(QString::fromUtf8("verticalLayouts"));
    verticalLayoutc->setContentsMargins(5,0,5,0);
    verticalLayoutc->setSpacing(0);
    verticalLayoutc->addWidget(cbox);
    ui->tableWidget->setCellWidget(rowNo,colComBox,wgc);

    // 添加按钮
    QPushButton *bt = new QPushButton(this);
    bt->setText("加载进度");
    connect(bt,SIGNAL(clicked()),this,SLOT(createEditwidget()));  // 添加  按钮 点击处理

    QWidget *wgb = new QWidget(this);
    QHBoxLayout *verticalLayoutb = new QHBoxLayout(wgb);
    verticalLayoutb->setContentsMargins(10,1,10,1);
    verticalLayoutb->addWidget(bt);
    ui->tableWidget->setCellWidget(rowNo,colButton,wgb);

二、 获取那个 按钮 和 下拉框 位置

通过转换 this->sender() ,得到按钮的坐标, 通过坐标转换为按钮所在行列,下拉框原理和这个相同 

//按钮点击,获取所在行的行号
void MainWindow::createEditwidget()
{
    QPushButton *bt = dynamic_cast(this->sender());

    if (bt == nullptr)
        return;

    int x = bt->parentWidget()->frameGeometry().x();
    int y = bt->parentWidget()->frameGeometry().y();

    QModelIndex index = ui->tableWidget->indexAt(QPoint(x,y));
    int row = index.row();
    int colum = index.column();
}

三 、修改进度条

通过上面代码找到 按钮 所在行, 然后找到 进度条 所在的widget, 通过定义的名字就能找到控件 

    // 获取行列的widget
    QWidget *wig = ui->tableWidget->cellWidget(row,colPro);
    
    // 通过名称,找到控件
    QProgressBar* progBar= wig->findChild("proBar");

    int value = progBar->value() + 5;
    progBar->setValue(value);
    progBar->setFormat(QString("当前进度为:%1%" ).arg(qRound(100.0*value / 100)));

最后的效果:

QTableWidget 添加 按钮、进度条、下拉框,以及处理事件_第1张图片

 

你可能感兴趣的:(qt,qt)