如何使用 rubberBand 一次在单个窗口中缩放多个 QChartView 并强制它们适合此窗口

How to scale multiple QChartViews in a single window at once with rubberBand and force them fit this window

提问人:Mika 提问时间:8/17/2023 更新时间:8/17/2023 访问量:33

问:

我试图创建一个包含一些chartViews的窗口。每个 chartView 包括 2 个折线图。我的目标是一次调整每个 chartView 的大小,方法是使用 rubberBand 仅调整其中一个 chartView 的大小。因此,每个 chartView 都应该相互侦听(事件左右),并在每次调整其邻居之一的大小时更新其比例。我试图实现这个想法(使用“单工”监听测试,但需要“多工”监听),但我没有获得成功。代码如下:

from PySide6.QtCore import Qt

from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PySide6 import QtCharts, QtGui


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Charts")

        layout = QVBoxLayout()
        widget = QWidget()
        widget.setLayout(layout)

        self.chart_view1 = self.create_chart_view()
        layout.addWidget(self.chart_view1)
        self.chart_view1.rubberBandChanged.connect(self.handle_rubber_band_change)

        self.chart_view2 = self.create_chart_view()
        layout.addWidget(self.chart_view2)

        self.chart_view3 = self.create_chart_view()
        layout.addWidget(self.chart_view3)

        self.chart_view4 = self.create_chart_view()
        layout.addWidget(self.chart_view4)

        self.chart_view5 = self.create_chart_view()
        layout.addWidget(self.chart_view5)

        self.chart_view6 = self.create_chart_view()
        layout.addWidget(self.chart_view6)

        self.setCentralWidget(widget)

    def handle_rubber_band_change(self, rubberband_rect):
        x_range = self.chart_view1.chart().axisX().range()
        y_range = self.chart_view1.chart().axisY().range()

        new_x_range = x_range.length() / self.chart_view1.rect().width() * rubberband_rect.width()
        new_y_range = y_range.length() / self.chart_view1.rect().height() * rubberband_rect.height()

        self.chart_view2.chart().axisX().setRange(x_range.center() - new_x_range / 2, x_range.center() + new_x_range / 2)
        self.chart_view2.chart().axisY().setRange(y_range.center() - new_y_range / 2, y_range.center() + new_y_range / 2)

    def create_chart_view(self):
        chart_view = QtCharts.QChartView()
        chart_view.setMinimumSize(200, 150)

        chart = QtCharts.QChart()

        series1 = QtCharts.QLineSeries()
        series1.setName("Chart 1")
        series1.append(0, 0)
        series1.append(1, 1)
        series1.append(2, 4)
        chart.addSeries(series1)

        series2 = QtCharts.QLineSeries()
        series2.setName("Chart 2")
        series2.append(0, 0)
        series2.append(1, 2)
        series2.append(2, 8)
        chart.addSeries(series2)

        # Axis setup
        axis_x = QtCharts.QValueAxis()
        axis_x.setLabelFormat("%.1f")
        axis_x.setTitleText("X")
        chart.addAxis(axis_x, Qt.AlignBottom)

        axis_y = QtCharts.QValueAxis()
        axis_y.setLabelFormat("%.1f")
        axis_y.setTitleText("Y")
        chart.addAxis(axis_y, Qt.AlignLeft)

        # Series connection
        series1.attachAxis(axis_x)
        series1.attachAxis(axis_y)

        series2.attachAxis(axis_x)
        series2.attachAxis(axis_y)

        chart_view.setChart(chart)

        chart_view.setRenderHint(QtGui.QPainter.Antialiasing) 
        chart_view.setRubberBand(
            QtCharts.QChartView.HorizontalRubberBand) 

        return chart_view


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

此外,我正在尝试使 chartViews 尽可能紧凑,以适应窗口。我的目标是:但我有这个。太多的空白和不可读的值:因此,关键是要用橡皮筋一次缩放所有图表,并强制它们使用可读值将窗口组合在一起。

是否有可能用 PySide6 图表实现这种行为和前景?或者使用一些外部库会更好?

P.S. 为了不产生外部问题,是否有可能强制图表不要变得太小?我希望它们无休止地放大,但是,当图表适合 QChartView 的大小时,应该停止缩小,这样图表就不会从左右边框“脱落”。

蟒蛇 python-3.x qt pyqt pyside

评论

0赞 relent95 8/18/2023
您不应该使用信号。该信号用于选择带有 .您应该覆盖 .此外,您应该访问 X 轴的范围,例如 .rubberBandChangedsetDragMode(QGraphicsView.RubberBandDrag)mouseReleaseEvent()ax = self.chart().axes()[0]; print([ax.min(), ax.max()])

答: 暂无答案