简体   繁体   中英

PyQt5: QWidgets shows without any datas

After my previous problem, I have my widgets on my main window. But this lasts doesn't come with any data: the datagridview haven't columns and the treeview are invisible or without my hard coded items. Here's my code:

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)

module: Family.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)

module: 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

The result of this code gives: 在此处输入图片说明

hope you can help me again,

thanks per advance !

Not really sure why you want to derive FamilyTreeView from QWidget . I worked out a solution deriving it from QTreeView , directly. Your addItems method works correctly, but I used invisibleRootItem member of QStandardItem as the upper parent (ie root).

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)

Your EventsTableView class has some issues too. It inherits from QTableWidget (ie is a QTableWidget) but yet defines an inner QTableWidget, which is unnecessary. Here is a better version:

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM