【问题标题】:PyQt Subclass from QTableWidgetItem and QWidgetQTableWidgetItem 和 QWidget 的 PyQt 子类
【发布时间】:2014-11-19 14:28:15
【问题描述】:

我在 Pyqt 中制作了一个 QTableWidget,但遇到了一些烦人的问题。

我需要在我的表格中使用小部件来实现其功能,因此我使用 setCellWidget 将它们添加到表格中。但是,小部件没有 QTableWidgetItem 提供的相同方法(尤其是在表格中的选择方面)。

我想知道是否可以对这两个项目进行子类化,这样我就可以同时拥有这两个项目的方法,以及如何将其添加到表格中。

类似:

class TableItem(QtGui.QTableWidgetItem, QtGui.QWidget):
    def __init__(self, parent=None):
        super(TableItem, self).__init__(parent)

        self.check = QtGui.QCheckBox()
        self.label = QtGui.QLabel('Some Text')
        self.h_box = QtGui.QHBoxLayout()
        self.h_box.addWidget(self.check)    
        self.h_box.addWidget(self.label)

然后以某种方式将它作为 TableWidgetItem 添加到我的表格中,以便它显示小部件并且还具有可用的选择方法。

这里有什么想法吗?

供参考: setCellWidget:http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidget.html#setCellWidget QWidget:(很容易找到,我不能发布超过 2 个链接) - 没有适合表格的好方法 QTableWidgetItem:http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidgetitem.html#type 使用 isSelected 和 setSelected(setCellWidget 中使用的小部件无法使用方法。

要在单元格中返回小部件,您可以使用 table.cellWidget(row, column) 然后在其上使用您的小部件方法。但是因为 setSelected 和 isSelected 不是小部件的方法,所以您无法检查选择。我希望将两者合并在一起以允许两者

--基本上我需要知道如何让我的类在我调用它以使用 setItem 添加到表时“返回”正确的类型

【问题讨论】:

  • 我是否正确理解您希望 QTableWidget 中的项目本身是小部件,而不是通常用于制作 QTableWidgetItems 的普通 QStrings、ints 等?
  • 正确。 QTableWidget 中有一个方法 setCellWidget ,您可以在其中使用表格中的小部件 - 这太棒了,而且效果很好。唯一的问题是你没有得到 QTableWidgetItem 附带的好方法,比如选择状态等。我会更新问题以链接到每个
  • 我觉得你的继承方式基本正确。究竟是什么不适合这种方法?
  • 哦,我认为只是super() 可能行不通。除此之外,我认为它可能会起作用。
  • 我认为 super 应该可以工作,py docs 说它允许多项初始化。但我两种方式都试过了。我不确定如何添加它......基本上,如何从类中获取“返回值”。因为如果我运行它,上面的代码然后说 test = TableItem() .setItem(row, column, test) 它不会添加,我会收到错误(通常是非常非描述性的错误。如果我向其中添加一个函数这将返回 hbox,然后 setItem 将不起作用,因为 hbox 是一个小部件。我不确定如何让类作为 tablewidgetitem 返回的最后一步。像 repr 之类的东西?

标签: python class pyqt pyside qwidget


【解决方案1】:

我不确定你想做什么,但你可以“注入”这样的方法:

class TableWidgetItem(QtGui.QTableWidgetItem):
    def __init__(self, parent=None):
        QtGui.QTableWidgetItem.__init__(self)

    def doSomething(self):
        print "doing something in TableWidgetItem"

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self)

tableWidgetItem = TableWidgetItem()
widget = Widget()

def widgetFunction(self):
    tableWidgetItem.doSomething()

# as an instance method
settatr(widget, "widgetFunction", MethodType(widgetFunction, widget, type(widget)))

# or as a class method
settatr(widget, "widgetFunction", widgetFunction)

那么你可以:

>>>widget.widgetFunction()
doing something in TableWidgetItem

(未测试)

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多