如何在 QML Canvas 对象中检索 QPainter 对象

时间:2021-07-21 16:47:37

标签: c++ qt qml

我有一个 QML Canvas,我通过覆盖 paint(QPainter *painter) 方法并使用一堆使用该 painter 对象的语句在 C++ 上绘图。

像……之类的东西

void myGraphDisplay::paint (QPainter* painter) {

    QPainterPath path;
    path.MoveTo(0, 0);
    path.LineTo(100, 100);
    painter->strokePath(path, painter->pen());

现在一段时间后,另一个函数想要在画布上绘制,但 painter 对象不再可用。我曾尝试将其保存为 myGraphDisplay 类的私有成员,但如果我尝试在以后的函数中再次访问它,我的应用程序就会崩溃。

void myGraphDisplay::updateGraph () {
    QPainterPath path;
    path.MoveTo(100, 0);
    path.LineTo(0, 100);
    painter->strokePath(path, painter->pen()); // where do I get "painter" here?

我也试过

QPainter painter(this);

QT reference pages 所示,但这给了我一个错误...

<块引用>

没有匹配的函数调用 QPainter::QPainter(myGraphDisplay*)

如何获取当前的 QPainter 对象?如果有帮助,updateGraph() 是从同一个 QML 调用的 Q_INVOKABLE

1 个答案:

答案 0 :(得分:2)

规则规定,绘制 QQuickItem 的过程发生在paint方法中,而不是在另一个方法中。通用的解决方案是:

  1. 将绘画信息保存在类的某个属性中。
  2. 调用paint方法
  3. 实现paint方法中的逻辑。

*.h

private:
    QPainterPath m_path;

*.cpp

myGraphDisplay::myGraphDisplay(QQuickItem *parent): QQuickItem(parent){
    // default path
    m_path.MoveTo(0, 0);
    m_path.LineTo(100, 100);
}

void myGraphDisplay::updateGraph(){
    QPainterPath path;
    path.MoveTo(100, 0);
    path.LineTo(0, 100);
    m_path = path;
    update();
}

void myGraphDisplay::paint (QPainter* painter) {
    painter->strokePath(m_path, painter->pen());
}
相关问题