Qt quick 2 绘制方法没有被调用

Posted

技术标签:

【中文标题】Qt quick 2 绘制方法没有被调用【英文标题】:Qt quick 2 paint method doesn't get called 【发布时间】:2013-10-20 16:59:47 【问题描述】:

我创建了一个简单的 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);

【问题讨论】:

【参考方案1】:

尝试设置自定义项的宽度和高度。

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"
    

【讨论】:

太糟糕了,在引入宽度和高度后不知何故对我有用。【参考方案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);粒子 = 新粒子(); 你确定你的构造函数被调用了,即你在注册你的类型时没有问题吗? 并且该标志无关紧要,因为 QQuickPaintedItem 在其构造函数中设置了该标志。 我正在检查它是否被调用并被调用。 没有看到更多代码很难提供帮助。你能分享你注册类型和实际 QML 的代码吗?【参考方案3】:

确保您在某个时间致电update(),这将安排重绘。

作为不相关的附注,请注意线程 - 从渲染线程调用paint(),因此您需要对particle 等内容进行适当的同步。

【讨论】:

我应该在哪里拨打Update 在构造函数中调用update()触发第一次绘制,稍后需要重绘时调用update() 我在构造函数中添加了 update(),但绘制没有被触发。【参考方案4】:

尝试在类声明后添加这一行

QML_DECLARE_TYPE(粒子处理器)

【讨论】:

以上是关于Qt quick 2 绘制方法没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

从Qt Quick WorkerScript调用Python方法

从 Qt Quick WorkerScript 调用 Python 方法

Qt Quick 2 iOS Notch 避免

如何通过按下和拖动在 Qt Quick/QML 画布中绘制一个矩形

如何在 Qt Quick 中将 QML 项目转换为相应的 C++ 项目

Qt 5 (Qt Quick) MenuItem 大部分时间显示为空白