Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt quick 2绘制方法不适用于';我没接到电话_C++_Qt_Qml - Fatal编程技术网

C++ Qt quick 2绘制方法不适用于';我没接到电话

C++ Qt quick 2绘制方法不适用于';我没接到电话,c++,qt,qml,C++,Qt,Qml,我创建了一个简单的Qt快速应用程序,我有一个关于QQuickPaintedItem的问题。 我在调试模式下检查了画图是否被调用,但没有。 无论如何,这是我的代码: 资料来源: ParticleHandler::ParticleHandler(QQuickPaintedItem *parent) : QQuickPaintedItem(parent) { setFlag(QQuickItem::ItemHasContents); particle = new Particle();

我创建了一个简单的Qt快速应用程序,我有一个关于QQuickPaintedItem的问题。 我在调试模式下检查了画图是否被调用,但没有。 无论如何,这是我的代码:

资料来源:

ParticleHandler::ParticleHandler(QQuickPaintedItem *parent) : QQuickPaintedItem(parent)
{
    setFlag(QQuickItem::ItemHasContents);
    particle = new Particle();
}
void ParticleHandler::paint(QPainter *painter)
{
    QPen pen = QPen(m_color);
    painter->setPen(pen);
    painter->setRenderHints(QPainter::Antialiasing, true);
    painter->drawEllipse(particle->Position.x,particle->Position.y,particle->Radius/2,particle->Radius/2);
}
标题:

ParticleHandler(QQuickPaintedItem *parent = 0);
void paint(QPainter *painter);

如果看不到代码的其余部分,就不清楚主要问题是什么,但这里有一个完全独立的示例。也许会有帮助

#include <QGuiApplication>
#include <QPainter>
#include <QtQuick>

class PaintedItem : public QQuickPaintedItem {
    Q_OBJECT
public:
    PaintedItem(QQuickItem *parent = 0) : QQuickPaintedItem(parent) {
    }

    void paint(QPainter *painter) {
        painter->fillRect(contentsBoundingRect(), Qt::red);
    }
};

int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);

    qmlRegisterType<PaintedItem>("mymodule", 1, 0, "PaintedItem");

    QQuickView view(QUrl("qrc:///qml/main.qml"));
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.resize(500, 500);
    view.show();

    return a.exec();
}

#include "main.moc"

确保在某个时刻调用
update()
,这将安排重新绘制


另一个不相关的注意事项是,请注意线程-paint()是从渲染线程调用的,因此您需要对
粒子
之类的内容进行适当的同步,请尝试设置自定义项的宽度和高度

import QtQuick 2.0
import Fizika 1.0
Rectangle
{
  width: 360
  height: 360
  Particle
    { 
     width: 100
     height: 100
     radius: 20
     x: 100
     y: 200
     color: "red"
    }
}

尝试在类声明后添加此行

QML_声明_类型(ParticleHandler)


除了构造器中的差异外,它基本上看起来像您的代码:setFlag(QQuickItem::ItemHasContents);粒子=新粒子();你确定你的构造函数被调用了吗?也就是说,你在注册你的类型时没有问题吗?这个标志是不相关的,因为QQuickPaintedItem在它的构造函数中设置了这个标志本身。我正在检查它是否被调用,它是否被调用。如果没有看到更多的代码,很难提供帮助。您可以在注册类型和实际QML的地方共享代码吗?我应该在哪里调用
更新
?在构造函数中调用Update()来触发第一次绘制,然后在需要重新绘制时调用Update(),将Update()添加到构造函数中,但绘制未被触发。太可怕了,在介绍了宽度和高度之后,不知何故对我很有用。
import QtQuick 2.0
import Fizika 1.0
Rectangle
{
  width: 360
  height: 360
  Particle
    { 
     width: 100
     height: 100
     radius: 20
     x: 100
     y: 200
     color: "red"
    }
}