PyQt5:QTWidgets 显示没有任何数据集

PyQt5: QWidgets shows without any datas

在我之前的问题之后,我的小部件在我的主 window 上。但这持续没有任何数据:datagridview 没有列和 treeview 是不可见的或没有我的硬编码项目。这是我的代码:

app.py

#!/usr/bin/env python
import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, qApp, QWidget, QMainWindow, QGridLayout, QMenuBar, QAction, QToolBar, QStatusBar

from views import Main

class TerraSoft(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle('TerraSoft')
        self.setWindowState(Qt.WindowMaximized)

        exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)

        fileMenu = self.menuBar().addMenu('File')
        fileMenu.addAction(exitAct)

        toolbar = self.addToolBar('Main')
        toolbar.addAction(exitAct)

        main = Main()
        self.setCentralWidget(main)

        self.statusBar().showMessage('Bienvenue dans TerraSoft')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = TerraSoft()
    ex.show()
    sys.exit(app.exec_())

.views.py

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, qApp, QAction, QSplitter, QMenuBar, QToolBar, QGridLayout, QStatusBar

from Family.views import FamilyTreeView
from Specie.views import EventsTableView

class Main(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        familyTreeView = FamilyTreeView(self)
        eventsTableView = EventsTableView(self)

        HSplitter = QSplitter(Qt.Horizontal)

        HSplitter.addWidget(familyTreeView)
        HSplitter.addWidget(eventsTableView)

        grid = QGridLayout()
        grid.addWidget(HSplitter)
        self.setLayout(grid)

模块:家庭。views.py

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QApplication, QWidget, QTreeView

families = [
    ("Craspedocephalus", [
        ("puniceus", []),
        ("trigonocephalus", [])
    ]),
    ("Trimeresurus", [
        ("albolabris", [])
    ]),
    ("Elapidé", [])
]

class FamilyTreeView(QWidget):
    """description of class"""
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.familyList = QTreeView()
        self.familyList.setMaximumWidth(300)

        self.model = QStandardItemModel()
        self.addItems(self.model, families)
        self.familyList.setModel(self.model)

        self.model.setHorizontalHeaderLabels([self.tr("Familles")])

    def addItems(self, parent, elements):     
        for text, children in elements:
            item = QStandardItem(text)
            parent.appendRow(item)
            if children:
                self.addItems(item, children)

模块:specie.views.py

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTreeView

class EventsTableView(QTableWidget):
    """description of class"""
    def __init__(self, *args):
        QTableWidget.__init__(self, *args)

        self.eventsTable = QTableWidget()
        self.eventsTable.setColumnCount(3)
        self.eventsTable.setHorizontalHeaderLabels(('Date', 'Catégorie', 'Description'))
    enter code here

这段代码的结果是:

希望你能再次帮助我,

谢谢预付!

不太确定为什么要从 QWidget 派生 FamilyTreeView。我制定了一个直接从 QTreeView 派生的解决方案。您的 addItems 方法工作正常,但我使用 invisibleRootItem QStandardItem 的成员作为上级父级(即根).

class FamilyTreeView(QTreeView):
    """description of class"""
    def __init__(self, *args):
        QTreeView.__init__(self, *args)

        the_model = QStandardItemModel()
        the_model.setHorizontalHeaderLabels([self.tr("Familles")])
        self.addItems(the_model.invisibleRootItem(), families)
        self.setModel(the_model)        

    def addItems(self, parent, elements):     
        for text, children in elements:
            item = QStandardItem(text)
            parent.appendRow(item)
            if children:
                self.addItems(item, children)

您的 EventsTableView class 也有一些问题。它继承自 QTableWidget(即 是一个 QTableWidget)但定义了一个内部 QTableWidget,这是不必要的。这是一个更好的版本:

class EventsTableView(QTableWidget):
    """description of class"""
    def __init__(self, *args):
        QTableWidget.__init__(self, *args)

        self.setColumnCount(3)
        self.setHorizontalHeaderLabels(('Date', 'Catégorie', 'Description'))