【问题标题】:Qt quick 2 paint method doesn't get calledQt quick 2 绘制方法没有被调用
【发布时间】: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);

【问题讨论】:

    标签: c++ qt qml


    【解决方案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(粒子处理器)

    【讨论】:

      猜你喜欢
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多