我正在使用Qt Designer来管理代码的大型UI和Pyside。我想在我的桌子上显示一个ComboBox。
以下答案给出了在自己管理UI时如何完成此操作的非常详细的说明: PyQt - How to set QComboBox in a table view using QItemDelegate
我的问题是:当pien-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来覆盖它吗?
提前致谢!
答案 0 :(得分: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”)。如果您再单击“推广”,Qt Designer会将类名显示为TableView
而不是QTableView
。
重新生成UI模块后,您将在文件底部看到一条额外的导入行,如下所示:
from mypkg.mainwindow import TableView
因此,将使用自定义TableView
类而不是QTableView
,并从Qt Designer获取所有设置 - 以及您想要自行添加的任何重新实现的内容。