如何检测在PyQt4中点击QTableWidget的cellwidget用户的行号和列号?

时间:2014-05-09 09:15:51

标签: python qt pyqt pyqt4 qtablewidget

我的目标是在multiple QPushButton中将cellwidget设置为QTableWidget,每当用户点击其中任何一个按钮时,它都会打印出Row和{{ 1}}它所在的表数。

因此,对于1 Column

QPushButton

enter image description here

当我点击每个按钮时,它会打印出行数和列号。但当我更改函数import sys from PyQt4 import QtGui,QtCore def CurrentPos(): clickme = QtGui.qApp.focusWidget() index = table.indexAt(clickme.pos()) if index.isValid(): print (index.row(), index.column()) def AddValues(): table.setRowCount(5) for i in range(5): button = QtGui.QPushButton('Click1') table.setCellWidget(i,1,button) button.clicked.connect(CurrentPos) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) table = QtGui.QTableWidget() table.setFixedSize(QtCore.QSize(330,250)) table.setEditTriggers(QtGui.QTableWidget.NoEditTriggers) table.setSelectionBehavior(QtGui.QTableWidget.SelectRows) table.setSelectionMode(QtGui.QTableWidget.NoSelection) table.horizontalHeader().setStretchLastSection(True) table.setFocusPolicy(QtCore.Qt.NoFocus) table.setColumnCount(3) table.setHorizontalHeaderLabels(['A','B','C']) table.setColumnWidth(0,50) table.setColumnWidth(1,200) table.show() AddValues() app.exec_() 以容纳多个按钮时:

AddValues

enter image description here

它不再打印出正确的行号和列号。相反,它只会打印(0,0)或(0,1),具体取决于按钮的位置。

我尝试打印出def AddValues(): table.setRowCount(5) for i in range(5): button1 = QtGui.QPushButton('Click1') button2 = QtGui.QPushButton('Click2') button3 = QtGui.QPushButton('Click3') button_layout = QtGui.QHBoxLayout() button_layout.addWidget(button1) button_layout.addWidget(button2) button_layout.addWidget(button3) buttons_widget = QtGui.QWidget() buttons_widget.setLayout(button_layout) table.setCellWidget(i,1,buttons_widget) button1.clicked.connect(CurrentPos) button2.clicked.connect(CurrentPos) button3.clicked.connect(CurrentPos) 并且它给了我QtGui.qApp.focusWidget()所以据我所知,焦点小部件是实际<PyQt4.QtGui.QPushButton object at 0x014B56F0>我点击而不是{{1名为QPushButton

我唯一怀疑的是QWidget方法返回相对于它的父窗口小部件的位置,即buttons_widget而不是.pos()本身。但我似乎无法找到QWidget (buttons_widget)方法的文档。

那么,我如何修改我的代码,以便每当用户点击3个按钮中的任何一个时,它就会打印出当前所在按钮的行号和列号。

我使用的是Windows XP SP3和Python 2.7.3

3 个答案:

答案 0 :(得分:4)

    buttonClicked = self.sender()
    index = self.table.indexAt(buttonClicked.pos())
    print index.row()

答案 1 :(得分:3)

我找到了解决方案。

index = table.indexAt(clickme.parent().pos())

我应该检查父QWidget而不是QPushButton

的位置

答案 2 :(得分:0)

萨姆的回答就像一个魅力。 RITZ XAVI,它的工作原理如下:

  1. buttonClicked = self.sender() - 检测发送信号的小部件

  2. postitionOfWidget = buttonClicked.pos() - 获取此发件人的x,y坐标

  3. index = self.table.indexAt(postitionOfWidget) - 带有该坐标的qtablewidget中的项目

  4. index.row()该qtablewidget内的项目行

  5. 山姆,我不能为此感谢你: - )