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

use*_*218 5 python model-view-controller qt qt-creator pyside

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

Does this mean that if I have a UI file, I still need to write out, then call something like the TableView object myself? Should I create a TableView in Qt Designer, then overwrite it with one I've created that inherits from QTableView and adds setItemDelegate?

Thanks in advance!

ekh*_*oro 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)
Run Code Online (Sandbox Code Playgroud)

因此,表视图作为对象的属性进行访问,该对象传递给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
Run Code Online (Sandbox Code Playgroud)

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