如何继承QPointF并设置自定义属性?

喷射

在我的图表中,我需要在每个图表中存储许多信息QPointF,但是当我子类化时QPointF,似乎没有作用,有人可以给我好的解决方案或想法吗?

代码是:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
from PyQt5.QtChart import *
import random

class MyPoint(QPointF):
    def __init__(self, *args):
        super().__init__(*args)

    def set_name(self, name):
        self.name = name

    def set_info(self, info):
        self.info = info


class DemoChar(QChartView):
    def __init__(self):
        super().__init__()
        self.setRenderHint(QPainter.Antialiasing)
        self.chart = QChart()
        self.chart.setTitle('Demo')
        self.chart.setAnimationOptions(QChart.SeriesAnimations)
        self.setChart(self.chart)
        self.lineItem = QGraphicsLineItem(self.chart)

        series = QLineSeries(name="random serie")
        series.setPointsVisible(True)
        series.clicked.connect(self.on_click)

        self.series = series

        for i in range(20):
            #series << QPointF(0.1 * i, random.uniform(-10, 10))
            pt = MyPoint( 0.1 * i, random.uniform(-10, 10) )
            pt.set_name(str(pt))
            pt.set_info(str(random.randint(1, 100)))
            series << pt

        self.chart.addSeries(series)
        self.chart.createDefaultAxes()

    def on_click(self, pt):
        one_pt = self.series.pointsVector()[0]
        print(one_pt)
       # print(one_pt.name)  #the point have no name, info attribute

app = QApplication([])
demo = DemoChar()
demo.show()
app.exec()
永乐

当您将QPointF传递给QLineSeries时,将使用仅复制x和y值的复制构造函数,即,它不复制对象,而仅复制某些属性。

因此,与其实施自定义QPointF相比,不如使用QVXYModelMapper实施映射到QLineSeries的模型:

import random

from PyQt5.QtCore import pyqtSlot, QPointF, Qt
from PyQt5.QtGui import QPainter, QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QApplication
from PyQt5.QtChart import QChart, QChartView, QLineSeries, QVXYModelMapper


class CustomModel(QStandardItemModel):
    def add_point(self, pt, name="", info=""):
        items = []
        for value in (pt.x(), pt.y(), name, info):
            it = QStandardItem()
            it.setData(value, Qt.DisplayRole)
            items.append(it)
        self.appendRow(items)

    def get_data(self, row):
        if 0 <= row < self.rowCount():
            pt = QPointF(
                self.item(row, 0).data(Qt.DisplayRole),
                self.item(row, 1).data(Qt.DisplayRole),
            )
            name = self.item(row, 2).data(Qt.DisplayRole)
            info = self.item(row, 3).data(Qt.DisplayRole)
            return pt, name, info


class DemoChar(QChartView):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setRenderHint(QPainter.Antialiasing)
        self.chart = QChart()
        self.chart.setTitle("Demo")
        self.chart.setAnimationOptions(QChart.SeriesAnimations)
        self.setChart(self.chart)

        self.model = CustomModel()
        self.series = QLineSeries(name="random serie")
        self.series.setPointsVisible(True)
        self.series.clicked.connect(self.on_click)

        self.mapper = QVXYModelMapper(xColumn=0, yColumn=1)
        self.mapper.setModel(self.model)
        self.mapper.setSeries(self.series)

        for i in range(20):
            pt = QPointF(0.1 * i, random.uniform(-10, 10))
            name = "name-{}".format(i)
            info = str(random.randint(1, 100))
            self.model.add_point(pt, name, info)

        self.chart.addSeries(self.series)
        self.chart.createDefaultAxes()

    @pyqtSlot(QPointF)
    def on_click(self, pt):
        # first point
        index = 0
        value = self.model.get_data(index)
        if value is not None:
            pt, name, info = value
            print(pt, name, info)


def main(args):
    app = QApplication(args)
    demo = DemoChar()
    demo.show()
    ret = app.exec()


if __name__ == "__main__":
    import sys

    sys.exit(main(sys.argv))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何设置MSI自定义属性

来自分类Dev

设置自定义属性

来自分类Dev

如何使用属性设置自定义UITypeEditor的属性

来自分类Dev

如何在自定义WebViewPage中设置属性?

来自分类Dev

如何在自定义HttpMessageHandler中设置属性?

来自分类Dev

如何在自定义WebViewPage中设置属性?

来自分类Dev

如何从主窗口设置自定义控件的属性?

来自分类Dev

如何从自定义元素继承

来自分类Dev

设置自定义属性名称

来自分类Dev

设置自定义对象属性

来自分类Dev

jQuery从值设置自定义属性

来自分类Dev

选择自定义属性以设置样式

来自分类Dev

如何在 CSS 变量(又名自定义属性)中存储继承值?

来自分类Dev

如果类是继承的,则使用自定义设置器

来自分类Dev

使Django表单继承自定义字段属性的类

来自分类Dev

JavaScript:为什么getOwnPropertyDescriptor()包含自定义的继承属性?

来自分类Dev

获取Django表单以继承自定义字段属性的类

来自分类Dev

如何创建元素并设置自定义属性以映射简单的类型类属性

来自分类Dev

如何创建元素并设置自定义属性以映射简单的类型类属性

来自分类Dev

自定义元素继承

来自分类Dev

自定义元素继承

来自分类Dev

在样式设置器中设置自定义附加属性

来自分类Dev

如何设置自定义标题链接?

来自分类Dev

如何设置自定义组件的文档?

来自分类Dev

如何设置自定义UITableViewCell的宽度

来自分类Dev

如何设置自定义组件的文档?

来自分类Dev

如何设置.htaccess自定义重写?

来自分类Dev

如何设置自定义窗口高度?

来自分类Dev

如何设置自定义ID字段?