我有一个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的过程发生在绘制方法中,而不是其他方法中。通用解决方案是:
- 将绘画信息保存在类的某个属性中
- 调用绘制方法
- 实现绘制方法中的逻辑
*.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());
}