QT-QVBarModelMapper-Problem

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hey Leute ,

Ich habe folgendes Problem Ich versuche gerade in Python folgendes nachzubauen : https://doc.qt.io/qt-5/qtcharts-barmode ... ample.html

Mein Code sieht wie folgt aus :

Code: Alles auswählen

import sys, random
from PyQt5.QtWidgets import QApplication, QTableView, QWidget, QHeaderView, QGridLayout, QMainWindow
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, QVariant, Qt, QtDebugMsg, QTime,Qt
from PyQt5.QtGui import QColor, QPainter
from PyQt5.QtChart import QChartView, QValueAxis, QBarCategoryAxis, QChart, QBarSeries, QVBarModelMapper,QBarSet


class CustomTableModel(QAbstractTableModel):
    def __init__(self):
        super(CustomTableModel, self).__init__()



        self.data =[
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        ]


    def data(self, index, role):
        if role == Qt.DisplayRole:
            value = self.data[index.row()][index.column()]
            return value

        if role == Qt.EditRole:
            return self.data[index.row()][index.column()]

    def rowCount(self, index):
        return len(self.data)

    def columnCount(self, index):
        return len(self.data[0])

    def headerData(self, section, Qt_Orientation, role=None):
        if role == Qt.DisplayRole:
            if Qt_Orientation == Qt.Horizontal:
                return "Kanal"
            else:
                return ("Jan")

    def flags(self, index):
        return Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable

    def setData(self, index, value, role):
        if role == Qt.EditRole:
            row = index.row()
            column = index.column()
            data = value
            self.data[row][column] = data
            self.dataChanged.emit(index, index)
            return True
        return False


class Mainwindow():
    def __init__(self):
        app = QApplication(sys.argv)
        self.win = QWidget()


        m_model = CustomTableModel()
        tableview = QTableView()
        tableview.setModel(m_model)
        tableview.setMinimumWidth(300)
        tableview.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        tableview.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
        m_model.setParent(tableview)

        chart = self.chart()
        series = self.series(m_model,chart)
        self.Achsen(chart,series)
        chartview = self.chartview(chart)
        self.layout(tableview,chartview)
        self.win.show()

        sys.exit(app.exec_())

#-----------------------------------------------------------------------------------------------------------------------

    def chart(self):
        chart = QChart()
        chart.setAnimationOptions(QChart.AllAnimations)
        return chart




    def series(self,m_model,chart):

        series = QBarSeries()
        first = 3
        count = 5
        mapper = QVBarModelMapper()
        mapper.setFirstBarSetColumn(1)
        mapper.setLastBarSetColumn(4)
        mapper.setFirstRow(first)
        mapper.setRowCount(count)
        mapper.setSeries(series)
        mapper.setModel(m_model)
        chart.addSeries(series)
        return series

    def Achsen(self,chart,series):
        categories = ["April","May","June","July","August"]
        X_Achse = QBarCategoryAxis()
        X_Achse.append(categories)
        chart.addAxis(X_Achse,Qt.AlignBottom)
        series.attachAxis(X_Achse)

        Y_Achse = QValueAxis()
        print(Y_Achse)
        chart.addAxis(Y_Achse,Qt.AlignLeft)
        series.attachAxis(Y_Achse)


    def chartview(self,chart):
        chartview = QChartView(chart)
        chartview.setRenderHint(QPainter.Antialiasing)
        chartview.setMinimumSize(640, 480)
        return chartview



    def layout(self,tableview,chartview):
        Layout = QGridLayout()
        Layout.addWidget(tableview,1,0)
        Layout.addWidget(chartview,1,1)
        Layout.setColumnStretch(1, 1)
        Layout.setColumnStretch(0, 0)
        self.win.setLayout(Layout)







if __name__ == '__main__':
    Mainwindow()


Also das Programm gibt mir keine Fehler zurück und Funktioniert auch erst nur ich verstehe nicht ( Wenn Ich in meiner Tabelle was ändere aktualisiert leider mein Graph nicht und ich weiß leider nicht wieso ) Ich habe mir den Code im Qt Creator angeschaut dort funktioniert es genau so und Ich habe gedacht das QVBarModelMapper das händelt wenn sich was an den Daten ändert ...

Ich hoffe Ihr könnt mir weiterhelfen.

Mit freundlichen Grüßen:

Marcel
Eine Vision ohne Aktion bleibe eine Illusion
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wuerde das erstmal so bauen wie das Original. Ich vermute dein rumgemappe auf andere Namen und Bereiche spielt da eine Rolle. Auf die Schnelle konnte ich das nicht rausfinden.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ok Schade trotzdem vielen dank
Eine Vision ohne Aktion bleibe eine Illusion
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

So guten Abend nochmal ,

Ich habe den Rat von __deets__ angenommen und das Programm nochmal neu geschrieben zumindest so Gut wie Ich es kann ( bin noch ein Anfänger).

Ich weiß zwar nicht genau was anders ist aber nun funktioniert es so wie Ich es mir gewünscht haben:

Für Leute die eventuell auch mal Probleme damit haben poste ich hier mal meinen Code damit Ihr es ein bisschen leichter habt als Ich .

Code: Alles auswählen

import sys, random
from PyQt5.QtWidgets import QApplication, QTableView, QWidget, QHeaderView, QGridLayout, QMainWindow
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, QVariant, Qt, QtDebugMsg, QTime,Qt
from PyQt5.QtGui import QColor, QPainter
from PyQt5.QtChart import QChartView, QValueAxis, QBarCategoryAxis, QChart, QBarSeries, QVBarModelMapper,QBarSet


class CustomTableModel(QAbstractTableModel):
    def __init__(self):
        super(CustomTableModel, self).__init__()



        self.data =[
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        [4,9,2,4,5,4],
        [1,0,0,8,6,4],
        [3,5,0,4,3,4],
        ]


    def data(self, index, role):
        if role == Qt.DisplayRole:
            return self.data[index.row()][index.column()]
        elif role == Qt.EditRole:
            return self.data[index.row()][index.column()]
        return QVariant()


    def rowCount(self, index):
        return len(self.data)

    def columnCount(self, index):
        return len(self.data[0])

    def headerData(self, section, Qt_Orientation,role):
        if role == Qt.DisplayRole:
            if Qt_Orientation == Qt.Horizontal:
                return "Kanal"
            else:
                return ("Jan")

    def flags(self, index):
        return Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable

    def setData(self, index, value, role):
        if role == Qt.EditRole:
            row = index.row()
            column = index.column()
            data = value
            self.data[row][column] = data
            self.dataChanged.emit(index, index)
            return True
        return False


class Mainwindow():
    def __init__(self):
        app = QApplication(sys.argv)
        self.win = QWidget()

        m_model = CustomTableModel()
        tableview = QTableView()
        tableview.setModel(m_model)
        tableview.setMinimumWidth(300)
        tableview.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        tableview.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
        m_model.setParent(tableview)

        chart = QChart()
        chart.setAnimationOptions(QChart.AllAnimations)

        series = QBarSeries()
        first = 3
        count = 5
        mapper = QVBarModelMapper()
        mapper.setFirstBarSetColumn(1)
        mapper.setLastBarSetColumn(4)
        mapper.setFirstRow(first)
        mapper.setRowCount(count)
        mapper.setSeries(series)
        mapper.setModel(m_model)
        chart.addSeries(series)

        categories = ["April","May","June","July","August"]
        X_Achse = QBarCategoryAxis()
        X_Achse.append(categories)
        chart.addAxis(X_Achse,Qt.AlignBottom)
        series.attachAxis(X_Achse)
        Y_Achse = QValueAxis()
        chart.addAxis(Y_Achse,Qt.AlignLeft)
        series.attachAxis(Y_Achse)

        chartview = QChartView(chart)
        chartview.setRenderHint(QPainter.Antialiasing)
        chartview.setMinimumSize(640, 480)

        Layout = QGridLayout()
        Layout.addWidget(tableview,1,0)
        Layout.addWidget(chartview,1,1)
        Layout.setColumnStretch(1, 1)
        Layout.setColumnStretch(0, 0)
        self.win.setLayout(Layout)





        self.win.show()
        sys.exit(app.exec_())


if __name__ == '__main__':
    Mainwindow()
Eine Vision ohne Aktion bleibe eine Illusion
Antworten