提问人:Mika 提问时间:8/17/2023 更新时间:8/17/2023 访问量:33
如何使用 rubberBand 一次在单个窗口中缩放多个 QChartView 并强制它们适合此窗口
How to scale multiple QChartViews in a single window at once with rubberBand and force them fit this window
问:
我试图创建一个包含一些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 的大小时,应该停止缩小,这样图表就不会从左右边框“脱落”。
答: 暂无答案
评论
rubberBandChanged
setDragMode(QGraphicsView.RubberBandDrag)
mouseReleaseEvent()
ax = self.chart().axes()[0]; print([ax.min(), ax.max()])