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

2024-04-26 07:26:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是将multiple QPushButton设置为cellwidget中的QTableWidget,每当用户单击这些按钮中的任何一个,它都会打印出表中的RowColumn个数。

所以,对于1QPushButton

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>据我所知,focus小部件是我正在单击的实际QPushButton,而不是名为QWidgetbuttons_widget

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

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

我使用的是windows xp SP3和Python 2.7.3


Tags: indexconnecttablebuttonwidget按钮layoutqtgui
3条回答

山姆的回答很有魅力。RITZ XAVI,它的工作原理如下:

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

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

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

  4. qtablewidget中该项的index.row()行

山姆,我真是太感谢你了:-)

我找到了解决办法。

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

我应该检查父对象的位置,而不是检查父对象的位置

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

相关问题 更多 >