一 、 添加 按钮、进度条、下拉框
给 按钮 和 下拉框 添加信号和槽, 注意:每个控件都起个名字, 后面通过名字来查找控件。
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)));
最后的效果: