QTableWidget在单元格中动态添加的控件,获取所在列行

最近在使用QTableWidget,碰到了在单元格中动态添加控件,如QPushButton、QComboBox等,添加十分简单,直接使用QTableWidget::setCellWidget(int row, int column, QWidget widget)这一函数就可添加成功,但是怎么获取所在行列成了难题。
网上查找了相关方法,大多数都是使用的通过点击该控件的方法获取它的行和列;
按键对应的槽函数:
QPushButton
pButton = qobject_cast<QPushButton*>(sender());
int x = pButton->frameGeometry().x();
int y = pButton->frameGeometry().y();
QModelIndex index = ui.tableWidget->indexAt(QPoint(x, y));
int iRow = index.row();
int iCol = index.column();

这样就获取当前的行和列了,但是我获取到的全是0行0列,而且很多评论区的小伙伴也遇到了同样的问题,仔细分析了一下,问题出现在添加按键上,因为我需要添加的是两个按键,所以加了个布局以及 QWidget* btns = new QWidget(this);,这样获取的始终是在按键这个btns中的位置,所以一直都是0,0。
效果图:
在这里插入图片描述

直接看修正后的完整代码:
添加按键代码:

QHBoxLayout* hlayout = new QHBoxLayout();
hlayout->addStretch();
QPushButton* modify = new QPushButton(this);
QPushButton* remove = new QPushButton( this);
connect(modify, &QPushButton::clicked, this, &AlgoForm::modifyBtnClicked);
connect(remove, &QPushButton::clicked, this, &AlgoForm::removeBtnClicked);
hlayout->addWidget(modify);
hlayout->addWidget(remove);
hlayout->addStretch();
QWidget* btns = new QWidget(this);
btns->setLayout(hlayout);
ui->tableWidget->setCellWidget(row, 6, btns); //两按键添加到表格的row行,6列

对应的槽函数:

// 获取点击的按钮
QPushButton* Obj = qobject_cast<QPushButton*>(this->sender());
if (Obj == nullptr)
{
    
    
    return;
}
QModelIndex qIndex = ui->tableWidget->indexAt(QPoint(Obj->parentWidget()->frameGeometry().x(), Obj->parentWidget()->frameGeometry().y()));
// 获取按钮所在的行和列
int row = qIndex.row();
int column = qIndex.column();

与其他代码基本相同,就是要修改为获取父类窗体的位置,即Obj->parentWidget()->frameGeometry().x(),Obj->parentWidget()->frameGeometry().y(),这样就可正确获取按键所在表格的行列了。
总结:如果小伙伴添加按键时无任何附加操作,可直接用最上面的代码就可获取正确的位置,但是如果加入了布局,就需要修改为父类控件的位置,希望可以提醒到一些小伙伴,省下一些时间吃火锅!!!!

猜你喜欢

转载自blog.csdn.net/qq_41750806/article/details/115370956
今日推荐