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!
示例中的子类是多余的,因为它没有重新实现或添加任何方法。可以这样重写:
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 获取所有设置 - 以及您想要自己添加的任何重新实现的内容。
| 归档时间: |
|
| 查看次数: |
1361 次 |
| 最近记录: |