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



我有一个QML画布,通过重写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参考页所示,但这给了我一个错误。。。

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

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

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

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

*.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());
}

最新更新