QML 简单扩展不起作用

QML simple extension doesn't work

本文关键字:不起作用 扩展 简单 QML      更新时间:2023-10-16

我正在尝试用C++类扩展QML。我首先创建了一个简单的类Line。它调用 setter,但不调用 getter 和 paint 方法。知道为什么吗?在QtQuick 1.x中,我应该在构造函数中调用setFlag(QGraphicsItem::ItemHasNoContents, false);。也许我应该称类似的东西?

这是代码:

Line.h

#ifndef LINE_H
#define LINE_H
#include <QQuickPaintedItem>
class Line : public QQuickPaintedItem
{
    Q_OBJECT
    Q_PROPERTY(int x1 READ x1 WRITE setx1 NOTIFY x1Changed)
    Q_PROPERTY(int y1 READ y1 WRITE sety1 NOTIFY y1Changed)
    Q_PROPERTY(int x2 READ x2 WRITE setx2 NOTIFY x2Changed)
    Q_PROPERTY(int y2 READ y2 WRITE sety2 NOTIFY y2Changed)
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
    Q_PROPERTY(int penWidth READ penWidth WRITE setPenWidth NOTIFY penWidthChanged)
public:
    Line(QQuickItem *parent = nullptr);
    ~Line();
    void paint(QPainter *painter) override;
    int x1() const;
    ...
signals:
    void x1Changed(int arg);
    ...
public slots:
    void setx1(int arg);
    ...
private:
    int m_x1;
    ...
};
#endif // LINE_H

行.cpp

#include "Line.h"
#include <QPen>
#include <QPainter>
Line::Line(QQuickItem *parent) : QQuickPaintedItem(parent)
{
}
Line::~Line()
{
}
void Line::paint(QPainter *painter)
{
    QPen pen(m_color, m_penWidth);
    painter->setPen(pen);
    int x = qMin(m_x1, m_x2) - m_penWidth/2;
    int y = qMin(m_y1, m_y2) - m_penWidth/2;
    painter->drawLine(m_x1 - x, m_y1 - y, m_x2 - x, m_y2 - y);
}
int Line::x1() const
{
    return m_x1;
}
...
void Line::setx1(int arg)
{
    if (m_x1 == arg)
        return;
    m_x1 = arg;
    emit x1Changed(arg);
}
...

另外很明显,我已经在main中添加了我的班级注册: qmlRegisterType("extentiongui", 1, 0, "Line");

我的QML代码:

    Line {
        id: lineDelimiter
        x1: 863
        x2: 863
        y1: 660
        y2: 800
        penWidth: 8000
        color: "#c2c2c2"
    }

如果您的项目具有视觉内容,则应设置QQuickItem::ItemHasContents标志。

setFlag(QQuickItem::ItemHasContents, true);

此外,您应该在 setters 函数中调用 update() 来重绘您的项目。

void Line::setx1(int arg)
{
    if (m_x1 == arg)
        return;
    m_x1 = arg;
    emit x1Changed(arg);
    update();
}