我正在使用 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 覆盖它吗?
提前致谢!
示例中的子类是多余的,因为它没有重新实现或添加任何方法。可以这样重写:
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 获取所有设置 - 以及您想要自己添加的任何重新实现的内容。