使用 Pyside 和 Qt Designer 在 QTableView 中创建组合框

问题描述 投票:0回答:1

我正在使用 Qt Designer 来管理大型 UI 和 Pyside 来管理代码。我希望在我的表格中显示一个组合框。

以下答案非常详细地描述了如何在自己管理 UI 时完成此操作: PyQt - 如何使用 QItemDelegate 在表视图中设置 QComboBox

我的问题是:当 pyside-uic 已经为我创建了 UI 时,这将如何工作?链接中的代码或多或少包括:

class TableView(QtGui.QTableView):
    def __init__(self, *args, **kwargs):
        QtGui.QTableView.__init__(self, *args, **kwargs)

        # Set the delegate for column 0 of our table
        self.setItemDelegateForColumn(0, ComboDelegate(self))
[...]
class Widget(QtGui.QWidget):
    self._tm=TableModel(self)
    self._tv=TableView(self)
    self._tv.setModel(self._tm)

这是否意味着如果我有一个UI文件,我仍然需要写出来,然后自己调用类似TableView对象的东西?我应该在 Qt Designer 中创建一个 TableView,然后用我创建的继承自 QTableView 并添加 setItemDelegate 的 TableView 覆盖它吗?

提前致谢!

python pyside qt-designer qtableview qitemdelegate
1个回答
0
投票

示例中的子类是多余的,因为它没有重新实现或添加任何方法。可以这样重写:

from PySide import QtGui, QtCore
from mainwindowui import Ui_MainWindow

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self._model = TableModel(self)
        self._delegate = ComboDelegate(self)
        self.tableView.setModel(self._model)
        self.tableView.setItemDelegateForColumn(0, self._delegate)

因此,表视图作为对象的属性进行访问,该对象传递给由

setupUi
生成的 UI 类的
pyside-uic
方法。

但是,如果您确实需要从 Qt Designer 中子类化其中一个类怎么办?方法是将其提升为自定义类,该类将在导入 python UI 模块时替换它。

如果在 Qt Designer 中右键单击一个小部件并选择“升级到...”,它将弹出一个对话框。在对话框中,您可以设置自定义类名(例如“TableView”),并将头文件设置为应从中导入的 python 模块(例如“mypkg.mainwindow”)。如果您随后单击“Promote”,Qt Designer 会将类名显示为

TableView
而不是
QTableView

重新生成 UI 模块后,您将在文件底部看到一个额外的导入行,如下所示:

from mypkg.mainwindow import TableView

因此,将使用自定义

TableView
类而不是
QTableView
,并从 Qt Designer 获取所有设置 - 以及您想要自己添加的任何重新实现的内容。

© www.soinside.com 2019 - 2024. All rights reserved.