使用Pyside和Qt Designer在QTableView中创建ComboBox

时间:2014-01-10 20:13:56

标签: python qt model-view-controller qt-creator pyside

我正在使用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来覆盖它吗?

提前致谢!

1 个答案:

答案 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获取所有设置 - 以及您想要自行添加的任何重新实现的内容。