0

我已经实现了一个条形图,现在想在双击条形图时获取值。我了解插槽和信号概念,并且能够在双击时调用该函数,但不确定我应该使用什么参数来获取值。这是代码:

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow)
from PyQt5.QtChart import QChart, QChartView, QHorizontalBarSeries, QBarSet, QBarCategoryAxis, 
QValueAxis
from PyQt5.Qt import Qt 
from PyQt5.QtGui import QPainter
from PyQt5.QtChart import *


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(800, 600)

        set0 = QBarSet('A')
        set1 = QBarSet('B')
    

        set0.append([1, 2, 3, 4, 5, 6])
        set1.append([5, 0, 0, 4, 0, 7])

        series = QBarSeries()
        series.append(set0)
        series.append(set1)
    

        chart = QChart(
        chart.addSeries(series)
        chart.setTitle('ABC')

        chart.setAnimationOptions(QChart.SeriesAnimations)

        technology = ('Oracle', 'Teradata')

        axisY = QValueAxis()
        axisY.applyNiceNumbers()
        chart.addAxis(axisY, Qt.AlignLeft)
        series.attachAxis(axisY)

        axisX = QBarCategoryAxis()
        axisX.append(technology)
        chart.addAxis(axisX, Qt.AlignBottom)
        series.attachAxis(axisX)

    
        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignBottom)

        chartView = QChartView(chart)
        chartView.setRenderHint(QPainter.Antialiasing)
        self.setCentralWidget(chartView)

        series.doubleClicked.connect(self.bar_double_clicked)


    def bar_double_clicked(self, axisX,technology):
        print(axisX )

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
4

1 回答 1

1

您必须使用索引和 QBarSet 来获取信息。

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtChart import (
    QChart,
    QChartView,
    QBarSeries,
    QBarSet,
    QBarCategoryAxis,
    QValueAxis,
)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(800, 600)

        set0 = QBarSet("A")
        set1 = QBarSet("B")

        set0.append([1, 2, 3, 4, 5, 6])
        set1.append([5, 0, 0, 4, 0, 7])

        series = QBarSeries()
        series.append(set0)
        series.append(set1)

        chart = QChart()
        chart.addSeries(series)
        chart.setTitle("ABC")

        chart.setAnimationOptions(QChart.SeriesAnimations)

        technologies = [f"technology-{i}" for i in range(6)]

        axisY = QValueAxis()
        axisY.applyNiceNumbers()
        chart.addAxis(axisY, Qt.AlignLeft)
        series.attachAxis(axisY)

        self.axis_x = QBarCategoryAxis()
        self.axis_x.append(technologies)
        chart.addAxis(self.axis_x, Qt.AlignBottom)
        series.attachAxis(self.axis_x)

        chart.legend().setVisible(True)
        chart.legend().setAlignment(Qt.AlignBottom)

        chartView = QChartView(chart)
        chartView.setRenderHint(QPainter.Antialiasing)
        self.setCentralWidget(chartView)

        series.doubleClicked.connect(self.bar_double_clicked)

    def bar_double_clicked(self, index, barset):
        print(barset.label(), barset.at(index), self.axis_x.categories()[index])


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
于 2021-07-01T22:45:14.813 回答