【问题标题】:How to map QChart coordinate to QChartView point?如何将 QChart 坐标映射到 QChartView 点?
【发布时间】:2018-02-22 03:19:52
【问题描述】:

我想在QChart中做一个橡皮筋窗口,但是不知道如何将QChart的坐标映射到QChartView。

例如 (0, 0) 是一个QChart 坐标,在QChartView 中可能是(10, 10),怎么转换呢? 看到Get mouse coordinates in QChartView's axis system 的回答了

但是好像和我的要求相反。

import sys
from PyQt5.QtChart import QChart, QChartView, QLineSeries
from PyQt5.QtCore import QPointF, QEvent, QPoint, QRect
from PyQt5.QtWidgets import QApplication, QMainWindow, QRubberBand

class ChartView(QChartView):
    def init_rubber_band(self):
        chart = self.chart()

        start1 = chart.mapToPosition(QPointF(0, 0))
        start2 = chart.mapToScene(start1)
        start3 = QPoint()
        start3.setX(int(start2.x()))
        start3.setY(int(start2.y()))

        end = QPoint(200, 200)

        self.rubber = QRubberBand(QRubberBand.Rectangle, self);
        self.rubber.setGeometry(QRect(start3, end))
        self.rubber.show()


app = QApplication(sys.argv)
series0 = QLineSeries()
series1 = QLineSeries()

series0 << QPointF(1, 15) << QPointF(3, 17) << QPointF(7, 16) << QPointF(9, 17) \
        << QPointF(12, 16) << QPointF(16, 17) << QPointF(18, 15)
series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) \
        << QPointF(12, 3) << QPointF(16, 4) << QPointF(18, 3)

chart = QChart()
chart.addSeries(series0)
chart.addSeries(series1)
chart.createDefaultAxes()
chartView = ChartView(chart)

chartView.init_rubber_band()

window = QMainWindow()
window.setCentralWidget(chartView)
window.resize(400, 300)
window.show()

sys.exit(app.exec_())

我用mapToPosition获取原点坐标,但是好像不行。

【问题讨论】:

    标签: python pyqt qchart qchartview


    【解决方案1】:

    如果你想执行一些计算,你必须在小部件显示后进行,因为QChartView 只是重新计算项目,在下面的示例中,我将创建一个QRubberBand,它位于一个矩形上,其坐标与@987654325 有关@从QPointF(1, 17)QPointF(18, 2)

    class ChartView(QChartView):
        def init_rubber_band(self):
            chart = self.chart()
            start_value = QPointF(1, 17)
            end_value = QPointF(18, 2)
            start = chart.mapToPosition(start_value)
            end = chart.mapToPosition(end_value)
    
            self.rubber = QRubberBand(QRubberBand.Rectangle, self)
            self.rubber.setGeometry(QRect(start.toPoint(), end.toPoint()))
            self.rubber.show()
    
    
    app = QApplication(sys.argv)
    series0 = QLineSeries()
    series1 = QLineSeries()
    
    series0 << QPointF(1, 15) << QPointF(3, 17) << QPointF(7, 16) << QPointF(9, 17) \
            << QPointF(12, 16) << QPointF(16, 17) << QPointF(18, 15)
    series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) \
            << QPointF(12, 3) << QPointF(16, 4) << QPointF(18, 3)
    
    chart = QChart()
    chart.addSeries(series0)
    chart.addSeries(series1)
    chart.createDefaultAxes()
    chartView = ChartView(chart)
    
    window = QMainWindow()
    window.setCentralWidget(chartView)
    window.resize(400, 300)
    window.show()
    
    chartView.init_rubber_band()
    
    sys.exit(app.exec_())
    

    输出:

    【讨论】:

    • 非常感谢。而橡皮筋矩形应该是从左上角到右下角开始的,我倒过来理解了。
    • 我想给你一杯咖啡,你有支付宝吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2017-04-19
    • 2022-01-02
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多