簡體   English   中英

如何訪問每個小部件的軸

[英]How to access the axes of each widget

我使用圖表的滾動條。 添加第二個及后續圖形時,條形圖不會滾動瀏覽新圖形。

並且在刪除新圖表時,嘗試滾動時會發生錯誤。

我知道需要單獨訪問每個圖表,但我不知道該怎么做?

我假設需要通過數組訪問所有圖形的“self._chart.axis”。

from PyQt5 import QtCore, QtGui, QtWidgets, QtChart
import math


mas =[1.33, 1.15, 1.55, 1.65, 1.64, 1.91, 1.33, 2.3, 1.5, 1.35, 2.52, 1.77, 1.7, 1.87, 2.0, 1.55, 1.73, 2.1,
              1.33, 1.15, 1.55, 1.92, 1.64, 1.91, 1.33, 1.71, 1.5, 1.35, 1.22, 1.77, 1.7, 1.87, 2.7, 1.55, 1.73, 2.1,
              1.33, 1.15, 1.55, 1.92, 1.64, 1.91, 1.33, 1.71, 1.5, 1.35, 1.22, 1.77, 1.7, 1.87, 2.0, 1.55, 1.73, 2.1]
x = len(mas)
x_ = x - 1

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, start = 1, parent=None):
        self.start = start
        super().__init__(parent)

        self.step = 30

        self.scrollbar = QtWidgets.QScrollBar(
            QtCore.Qt.Horizontal,
            sliderMoved=self.onAxisSliderMoved,
            pageStep=self.step,
        )
        self.scrollbar.setRange(0, x_)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        self.open = QtWidgets.QPushButton()
        self.open.setText("Open")
        self.open.clicked.connect(self.open_clicked)

        self.close = QtWidgets.QPushButton()
        self.close.setText("Close")
        self.close.clicked.connect(self.close_clicked)

        self.hbox = QtWidgets.QHBoxLayout()
        self.hbox.addWidget(self.open)
        self.hbox.addWidget(self.close)

        self.splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)

        self.lay = QtWidgets.QVBoxLayout(central_widget)

        self.lay.insertLayout(0, self.hbox)
        self.lay.addWidget(self.splitter, stretch=1)
        self.lay.addWidget(self.scrollbar)

        self.open_clicked()

    def open_clicked(self):
        self._chart_view = QtChart.QChartView()
        self._chart = QtChart.QChart()
        self._line_serie = QtChart.QLineSeries()
        for i in range(0, len(mas)):
            self._line_serie.append(QtCore.QPointF(i, mas[i]))
        self._chart.addSeries(self._line_serie)
        self._chart.createDefaultAxes()
        self._chart_view.setChart(self._chart)
        self.splitter.addWidget(self._chart_view)

    def close_clicked(self):
        count = self.splitter.count()
        if count > 1:
            w = self.splitter.widget(count - 1)
            if w is not None:
                w.deleteLater()


    def adjust_axes(self, value_min, value_max):
        if value_min >= 0 and value_max >= 0 and value_max <= x_ and value_max > value_min:
            self._chart.axisX(self._line_serie).setRange(value_min, value_max)


    @QtCore.pyqtSlot(int)
    def onAxisSliderMoved(self, value):
        value2 = value + self.step
        value1 = value
        if value2 >= x_:
            value2 = x_
            value1 = value2 - self.step
        self.adjust_axes(math.floor(value1), math.ceil(value2))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow(start = 0)
    w.show()
    sys.exit(app.exec_())

問題與您之前的帖子類似:如果您使用相同的變量來引用多個對象,則該變量僅引用最后一個對象,因此當刪除該對象並想要刪除返回的對象時,應用程序會崩潰。 解決方案是使用拆分器遍歷 QChartView,並使用該信息獲取 QChart 和 QLineSeries:

def open_clicked(self):
    chart_view = QtChart.QChartView()
    chart = QtChart.QChart()
    line_serie = QtChart.QLineSeries()
    for i, value in enumerate(mas):
        line_serie.append(QtCore.QPointF(i, value))
    chart.addSeries(line_serie)
    chart.createDefaultAxes()
    chart_view.setChart(chart)
    self.splitter.addWidget(chart_view)
def adjust_axes(self, value_min, value_max):
    for i in range(self.splitter.count()):
        chart_view = self.splitter.widget(i)
        if isinstance(chart_view, QtChart.QChartView):
            chart = chart_view.chart()
            for serie in chart.series():
                chart.axisX(serie).setRange(value_min, value_max)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM