如何检测用户在PyQt4中点击QTableWidget的单元格行列号?

4 投票
3 回答
8332 浏览
提问于 2025-04-18 05:57

我的目标是把多个 QPushButton 设置为 QTableWidget 中的单元格小部件,每当用户点击这些按钮中的任何一个时,它会打印出按钮所在的行和列号。

首先,对于一个 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() 方法的文档。

那么,我该如何修改我的代码,以便每当用户点击这三个按钮中的任何一个时,它都能打印出按钮当前所在的行和列号呢?

我使用的是 Windows XP SP3 和 Python 2.7.3。

3 个回答

3

Sam的回答真是太棒了。RITZ XAVI,它的工作原理如下:

  1. buttonClicked = self.sender() - 这个步骤用来找到发出信号的那个小部件

  2. postitionOfWidget = buttonClicked.pos() - 这个步骤获取了这个小部件的x和y坐标

  3. index = self.table.indexAt(postitionOfWidget) - 这个步骤在qtablewidget中找到这个坐标对应的项目

  4. index.row() - 这个步骤获取了在qtablewidget中该项目所在的行

Sam,我真的非常感谢你!:-)

7

这段代码的意思是……

首先,它定义了一个变量,这个变量用来存储一些信息。接下来,它会执行一些操作,比如计算、比较或者是处理数据。最后,代码会输出结果,可能是显示在屏幕上,或者是保存到文件里。

总的来说,这段代码的目的是为了完成某个特定的任务,帮助我们更方便地处理信息。

如果你对代码的具体细节有疑问,可以逐行分析,看看每一行是做什么的,这样会更容易理解。

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

我找到了解决办法。

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

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

撰写回答