我有一个 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
。
答案 0 :(得分:2)
规则规定,绘制 QQuickItem 的过程发生在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());
}