点击得到QTableWidget中任意位置QPushButton的行列信息

http://www.qtcn.org/bbs/read-htm-tid-51835.html

http://www.qtcn.org/bbs/simple/?t43841.html

比如(点击每行最后的QPushButton删除这行)


实现思路:
1写一个button类,继承自QPushButton,使其具有一个信号sendPointer(button*),这个信号可以发射button自己的指针。并把clicked()信号和这个信号connect在一起。
2QTableWidget中写槽函数getPointer(button*)接收被点击按钮的指针。
3QTableWidget中点击button,触发clicked()信号->触发sendPointer()->getPointer(button*),槽函数做两件事:
a接收被点击按钮的指针。
bQWidget* cellWidget(int row, int column)遍历QTableWidget中所有的QWidget,把得到的QWidget指针进行类型转换,转换成button类,然后与得到的指针比较。两枚指针一致,则知道button所在行列。

===
这个问题有很多实现办法。比如用委托。
上面是我的实现。已成功。




mixer 2011-06-15 06:40

请教个QTableWidget中添加QPushButton后的响应问题

QTableWidget的列数固定,行数由传入的数据量决定,每个行的0列为数据,1、2列为编辑、删除按钮QPushButton。所以添加按钮及connect信号/槽在for循环中做,通过按钮操作(对应行,0列)的数据。
现在的问题是,按钮的clicked()信号发给槽doModify、doDel时,槽并不知道发送者的位置,而如果没有点击过TableWidget本身的话,currentIndex也不能利用,造成槽的动作无法定位0列的数据。
请教高手,是不是有别的办法?


mixer 2011-06-15 07:03
最简单的办法,大概是不添加按钮,点击某行后再new出来,这样就很容易确定是在操作哪个数据。不过,感觉不太地道。


zhangyueyi87 2011-06-15 09:07
简单,设置按钮ui->pushButton->setFocusPolicy(Qt::NoFocus);
并在构造函数中设置ui->tableWidget->setFocus();


weiweiqiao 2011-06-15 09:10
你试着调用QTableWidget::activateWindow()和QTableWidget::setCurrentCell ( int 0, int 0),始终将将控件激活。


mixer 2011-06-16 22:00

感谢回复,不过前天另想个办法.
在button的slot函数中,从sender得到button指针,根据这个button的位置(x,y),由tablewidget->itemAt(x,y)可得到modelindex,其中itemAt不受scroll影响.
用这个方法的好处是,从modelindex开始,能完全操作tablewidget.

int x = obj->frameGeometry().x();//obj为你QPushButton
int y = obj->frameGeometry().y();

QModelIndex index = m_pTableWidget->indexAt(QPoint(x,y));

int row = index.row();
int column = index.column();

原文地址:https://www.cnblogs.com/lanye/p/5404698.html