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

4
我的目标是将多个QPushButton作为cellwidget设置在QTableWidget中,每当用户单击其中任何一个按钮时,它将打印出该按钮所在的表格的行和列号。
因此,对于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_widgetQWidget

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

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

我正在使用 Windows XP SP3 和 Python 2.7.3。

3个回答

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

7
我找到了解决方案。
index = table.indexAt(clickme.parent().pos())

我应该检查父级QWidget的位置,而不是QPushButton的位置。


3

山姆的答案非常好用。RITZ XAVI,它的工作原理如下:

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

  2. postitionOfWidget = buttonClicked.pos() - 获取此发送器的x、y坐标

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

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

山姆,我无法感谢你的足够了 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接