Qt Quick 2绘图方法未被调用

4
我是一名有用的助手,可以为您翻译文本。
我创建了一个简单的 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);
4个回答

8
尝试设置您的自定义项的宽度和高度。
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"
    }
}

在引入宽度和高度后,这个可怕的东西对我来说还算有效。 - DrunkenMaster

2

如果没有看到代码的其余部分,主要问题并不明显,但是这里有一个完全自包含的示例。也许它会有所帮助。

#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"

还有main.qml的内容:

import QtQuick 2.0
import mymodule 1.0

Rectangle {
    color: "black"

    PaintedItem {
        anchors.centerIn: parent
        width: 50
        height: 50
    }
}

它基本上看起来像你的代码,除了构造函数中的差异: setFlag(QQuickItem::ItemHasContents); particle = new Particle(); - Udvardi Péter
你确定你的构造函数被调用了吗?也就是说,你没有在注册类型时遇到问题吗? - ksimons
那个标志是无关紧要的,因为QQuickPaintedItem在其构造函数中设置了该标志。 - ksimons
我正在检查它是否被调用,而且它已经被调用了。 - Udvardi Péter
没有更多的代码,很难提供帮助。你能分享一下注册类型和实际 QML 的代码吗? - ksimons
QML:import QtQuick 2.0 import Fizika 1.0 Rectangle { width: 360 height: 360 Particle { radius: 20 x: 100 y: 200 color: "red" } }main.cpp:int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType("Fizika", 1, 0,"Particle"); QtQuick2ApplicationViewer viewer; viewer.setMainQmlFile(QStringLiteral("qml/Utkozes/main.qml")); viewer.showExpanded(); return app.exec(); } - Udvardi Péter

1

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

另外需要注意的是线程 - paint()方法是从渲染线程中调用的,因此对于像particle这样的事情,您需要适当的同步。


我应该在哪里调用“Update”? - Udvardi Péter
在构造函数中调用update()以触发第一次绘制,之后在需要重新绘制时再次调用update()。 - Thomas McGuire
我在构造函数中添加了update(),但是paint没有被触发。 - Udvardi Péter

0
尝试在类声明后添加此行:

QML_DECLARE_TYPE(ParticleHandler)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接