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

标签 python qt pyqt pyqt4 qtablewidget

我的目标是设置 multiple QPushButton作为cellwidgetQTableWidget每当用户点击这些按钮中的任何一个时,它都会打印出 RowColumn它所在的表数。

因此,对于 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_()

enter image description here

当我点击每个按钮时,它会打印出行数和列数。但是当我更改函数时 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)

enter image description here

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

我试图打印出 QtGui.qApp.focusWidget()它给了我<PyQt4.QtGui.QPushButton object at 0x014B56F0>据我所知,焦点小部件是实际的 QPushButton我点击的是 QWidget名为 buttons_widget .

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

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

我使用的是 windows xp SP3 和 Python 2.7.3

最佳答案

我找到了解决方案。

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

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

关于python - PyQt4中如何检测cellwidget用户点击QTableWidget的行号和列号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23560835/

相关文章:

python - 如何在tornado.wsgi.WSGIContainer中使用异步tornado API?

python - 超过 5000 万行数据 - CSV 或 MySQL

python - Jupyter Lab 在 RAM 不足时卡住计算机 - 如何预防?

qt - Qmake不支持源目录下的构建目录

python - 阻止并隐藏 QDialog : Alternative to exec_()?

python - 未调用 PyQt 窗口焦点事件

python - 来自 sys.platform 的可能值?

c++ - 使用 GCC switch case 范围,是否可以构建范围为 [A-Za-z] 的单个 case?

c++ - 将字符串转换为 char* 问题

python-2.7 - 这是 PyQt 4 python 错误还是行为错误的代码?