我想在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
获取原始点的坐标,但似乎不起作用。 最佳答案
如果要执行某些计算,则必须在显示小部件之后执行此操作,并且由于QChartView
只是重新计算项目,因此在以下示例中,我将创建一个位于与QRubberBand
相对于QChart
坐标的矩形上的QPointF(1, 17)
cc>至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_())
输出: