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/QML 画布中绘制一个矩形