【问题标题】:PyQt5 QtableWidget update row on cell click (mac) [duplicate]PyQt5 QtableWidget在单元格单击时更新行(mac)[重复]
【发布时间】:2021-03-30 16:03:50
【问题描述】:

我最近切换到 mac,但我的 pyqt5 应用程序运行不正常。我在行中设置了一个带有复选框的表格。在 PC 上,当您单击复选框时,它首先更新行,然后点击复选框。在 Mac 上,它只是点击复选框而不触发行更改。我什至无法弄清楚我要在哪一行进行任何更改。

这是可以在 pc 上运行的基本代码,但在 mac 上总是输出“0, 3”:

    for i in range(4):
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(i, item)
        item.setText(_translate("MainWindow", str(i)))

        self.tableWidget.setCellWidget(i, 0, QtWidgets.QCheckBox())
        self.tableWidget.cellWidget(i, 0).clicked.connect(lambda: print(self.tableWidget.currentRow(), i))

如果您想自己测试,这里是完整文件:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(195, 101, 371, 321))
        self.tableWidget.setObjectName("tableWidget")

        MainWindow.setCentralWidget(self.centralwidget)

        self.tableWidget.setColumnCount(1)
        self.tableWidget.setRowCount(4)

        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "Value"))

        for i in range(4):
            item = QtWidgets.QTableWidgetItem()
            self.tableWidget.setVerticalHeaderItem(i, item)
            item.setText(_translate("MainWindow", str(i)))

            self.tableWidget.setCellWidget(i, 0, QtWidgets.QCheckBox())
            self.tableWidget.cellWidget(i, 0).clicked.connect(lambda: print(self.tableWidget.currentRow(), i))


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 对于您的评论,我在解决问题时更新了帖子,提供了更多信息。这是一个非常清晰的版本,因为我之前的信息较少。不过,如果您能提供任何帮助,我将不胜感激。
  • 啊,好吧,我以为它已经死了。以后我会记住的,谢谢!所以我认为你无能为力?
  • 不不,这是一个获取编程问题帮助的网站。对发布的问题的帮助并非无关紧要。不过评论区泛滥成灾。

标签: python pyqt5


【解决方案1】:

不太确定这是否是解决方案,但在循环中连接信号时要小心,因为您最终可能会使用错误的变量(例如,i 可能总是 3)。

而不是像这样创建 lambda:

lambda: print(self.tableWidget.currentRow(), i)

尝试手动设置i参数:

lambda checked, i=i: print(self.tableWidget.currentRow(), i)

正如 musicamante 所指出的,点击信号会发出一个 checked 变量,需要忽略该变量,否则它将覆盖您为 i 设置的值。

作为另一种处理方式,这可能是一种更清洁的解决方案,但未经测试,我不确定手动将插槽定义为 int 是否会绕过 checked 参数。

def setupUI(self):
    ...
    self.tableWidget.cellWidget(i, 0).clicked.connect(partial(self.someMethod, i))

@QtCore.Slot(int)
def someMethod(self, i):
    print(self.tableWidget.currentRow(), i)

【讨论】:

  • 遗憾的是没有骰子,它现在总是输出“0,True”。我把它从i=i改成x=i,把打印中的i改成x,还是打印出“0, True”。感谢您的尝试!
  • @Shaw clicked 总是有一个 checked 参数(请阅读文档...)。改为lambda _, i=i: ...
  • 啊,我写了,没有考虑假设代码已经工作,将更新答案:)
  • @musicamante 和彼得哦,你们可爱的人谢谢你们!这是完美的,但如果你能指出具体文档的方向,以便我知道将来要寻找什么,我将非常感激。
  • doc.qt.io/qt-5.15/qtmodules.html 开始浏览所有类(以及每个类继承的类)。
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2019-02-20
  • 2021-01-22
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多