我的目标是将多个QPushButton作为cellwidget设置在QTableWidget中,每当用户单击其中任何一个按钮时,它将打印出该按钮所在的表格的行和列号。
因此,对于1个QPushButton,
因此,对于1个QPushButton,
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
更改为适应多个按钮:
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)
现在它不再正确地打印出行和列号。相反,它将只打印出 (0,0) 或 (0,1),具体取决于按钮的位置。
我尝试打印 QtGui.qApp.focusWidget()
,结果是 <PyQt4.QtGui.QPushButton object at 0x014B56F0>
,所以据我所知,焦点小部件是实际的 QPushButton
,而不是名为 buttons_widget
的 QWidget
。
我的唯一嫌疑对象是 .pos()
方法返回相对于其父窗口小部件(即 QWidget (buttons_widget)
)而不是 QTableWidget
本身的位置。但我似乎找不到 .pos()
方法的文档。
那么,我该如何修改代码,以便每当用户单击任何一个 3 个 Pushbutton 中的任意一个时,它都会打印出按钮当前所在的行和列号。
我正在使用 Windows XP SP3 和 Python 2.7.3。