加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:35:20 所属栏目:Python 来源:网络整理
导读:我的目标是在QTableWidget中将多个QPushButton设置为cellwidget,每当用户单击任何这些按钮时,它将打印出它所在的表的行号和列号. 那么,对于1个QPushButton, import sysfrom PyQt4 import QtGui,QtCoredef CurrentPos(): clickme = QtGui.qApp.focusWidget()
我的目标是在QTableWidget中将多个QPushButton设置为cellwidget,每当用户单击任何这些按钮时,它将打印出它所在的表的行号和列号.

那么,对于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,buttons_widget)
        button1.clicked.connect(CurrentPos)
        button2.clicked.connect(CurrentPos)
        button3.clicked.connect(CurrentPos)

它不再打印出正确的行号和列号.相反,它只会打印(0,0)或(0,1),具体取决于按钮的位置.

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

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

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

我使用的是Windows XP SP3和Python 2.7.3

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读