Seite 1 von 1

QT-QVBarModelMapper-Problem

Verfasst: Donnerstag 28. Mai 2020, 23:30
von Bl3nder
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

Re: QT-QVBarModelMapper-Problem

Verfasst: Freitag 29. Mai 2020, 10:29
von __deets__
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.

Re: QT-QVBarModelMapper-Problem

Verfasst: Freitag 29. Mai 2020, 12:37
von Bl3nder
Ok Schade trotzdem vielen dank

Re: QT-QVBarModelMapper-Problem

Verfasst: Freitag 29. Mai 2020, 22:30
von Bl3nder
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()