【问题标题】:Properties and QGraphicsSimpleTextItem属性和 QGraphicsSimpleTextItem
【发布时间】:2017-08-23 23:14:00
【问题描述】:

我想知道我们是否可以在继承 QGraphicsSimpleTextItem 的类中使用属​​性来制作动画?

我正在画这个按钮:

它是由:

  • 一个圆,继承QGraphicsObject并覆盖几何属性

  • 一个椭圆,基本相同,但以圆为父

  • 一个文本,继承QObjectQGraphicsSimpleTextItem

对于前两个,动画有效。但关于最后一个,我有以下错误:

QPropertyAnimation: you're trying to animate a non-existing property localisation of your QObject
QPropertyAnimation: you're trying to animate a non-existing property localisation of your QObject
QPropertyAnimation: you're trying to animate a non-existing property sizePolicy of your QObject
QPropertyAnimation: you're trying to animate a non-existing property sizePolicy of your QObject

这是我的课程“MyText”:

class MyTextOk : public QObject, public QGraphicsSimpleTextItem
{
    Q_PROPERTY(QPointF localisation READ localisation WRITE setLocalisation)
    Q_PROPERTY(QFont sizePolicy READ sizePolicy WRITE setSizePolicy)
public:
    explicit MyTextOk(QGraphicsObject *parent = 0);
    ~MyTextOk();

    QPointF localisation() const;
    void setLocalisation(const QPointF &value);

    QFont sizePolicy() const;
    void setSizePolicy(const QFont &value);

private:
    QRectF boundingRect() const;

protected :
    QPointF point;
    QFont font;
};

还有我的 .ccp

QVariant myFontInterpolator(const QFont &start, const QFont &end, qreal progress)
{
    if (progress<0.5)
    {
        int a = (1-progress)*50 + progress*45;
        QFont rt(start);
        rt.setPointSize(a);
        return rt;
    }
    else
    {
        int a = (1-progress)*45 + progress*50;
        QFont rt(start);
        rt.setPointSize(a);
        return rt;
    }
        Q_UNUSED(end)
}

MyTextOk::MyTextOk(QGraphicsObject *parent)
    : QObject(parent), QGraphicsSimpleTextItem(parent)
{
    point = QPointF(-40,-45);
    this->setText("Ok");
    this->setPos(point);
    this->setBrush(QBrush(Qt::white));
    font = QFont("Colibri",50);
    this->setFont(font);

    qRegisterAnimationInterpolator<QFont>(myFontInterpolator);
}

MyTextOk::~MyTextOk()
{

}

QPointF MyTextOk::localisation() const
{
    return point;
}

void MyTextOk::setLocalisation(const QPointF &value)
{
    if(point!=value)
    {
        point = value;
        update();
    }
}

QFont MyTextOk::sizePolicy() const
{
    return font;
}

void MyTextOk::setSizePolicy(const QFont &value)
{
    if(font!=value)
    {
        font=value;
        update();
    }
}

QRectF MyTextOk::boundingRect() const
{
    return QRectF(0,0,0,0);
}

我在我的 MainWindow 中制作动画:

void MainWindow::lancerAnimBoutonRond()
{
    animationBoutonRondTaille = new QPropertyAnimation(roundButton, "geometry");

    animationBoutonRondTaille->setDuration(300);
    animationBoutonRondTaille->setKeyValueAt(0, QRectF(-90, -90, 180, 180));
    animationBoutonRondTaille->setKeyValueAt(0.5, QRectF(-85,-85,170,170));
    animationBoutonRondTaille->setKeyValueAt(1, QRectF(-90, -90, 180, 180));

    animationBoutonRondTaille -> start();

    animationBoutonRondEllipse = new QPropertyAnimation(whiteShadow, "geometry");

    animationBoutonRondEllipse->setDuration(300);
    animationBoutonRondEllipse->setKeyValueAt(0,QRectF(-70,-80,140,80));
    animationBoutonRondEllipse->setKeyValueAt(0.5,QRectF(-65,-75,130,90));
    animationBoutonRondEllipse->setKeyValueAt(1,QRectF(-70,-80,140,80));

    animationBoutonRondEllipse->start(); // These two work

    animationBoutonRondOk = new QPropertyAnimation(textOk,"localisation");

    animationBoutonRondOk->setDuration(300);
    animationBoutonRondOk->setKeyValueAt(0,QPointF(-40,-45));
    animationBoutonRondOk->setKeyValueAt(0.5,QPointF(-35, -40));
    animationBoutonRondOk->setKeyValueAt(1,QPointF(-40, -45));

    animationBoutonRondOk->start(); //error : QPropertyAnimation: you're trying to animate a non-existing property localisation of your QObject

    animationBoutonRondOkTaille = new QPropertyAnimation(textOk,"sizePolicy");

    animationBoutonRondOkTaille->setDuration(300);
    animationBoutonRondOkTaille->setStartValue(QFont("Colibri",50));
    animationBoutonRondOkTaille->setEndValue(QFont("Colibri",50));

    animationBoutonRondOkTaille->start();  //error : 'QPropertyAnimation: you're trying to animate a non-existing property sizePolicy of your QObject'

}

我不知道是否可以命名我的“自己的”属性,但我不能(?)覆盖fontpos 属性,因为我继承了QGraphicsSimpleTextItem 并使用@ 987654330@和setPos()

如果你想尝试,你可以找到所有代码here

感谢您的宝贵时间。

【问题讨论】:

  • 我认为您只是缺少 Q_OBJECT 类定义中的 Q_OBJECT 宏。虽然我很惊讶moc 没有发出任何警告。
  • 哦,我讨厌我的生活。的确 !我没有更多错误,但动画仍然无用。有消息我会回来的
  • 谢谢它让它工作。我们只需要调用 pos 和 font 属性来使其工作。这个 Q_OBJECT 疏忽让我想错了。
  • 请发布解决方案作为答案(确保将链接中的相关内容带入答案),而不是作为您问题的更新。这是为了帮助未来的访客并减少混乱。谢谢。
  • 完成,谢谢您的建议。这比你说得对的 EDIT 更清楚。

标签: qt properties qgraphicssimpletextitem


【解决方案1】:

问题解决了。

MyTextOk 类定义中的Q_OBJECT 宏丢失。放置后,代码运行正常。

您可以找到我的按钮 here 的工作示例。

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2014-12-31
    • 2018-08-18
    • 1970-01-01
    • 2017-07-28
    • 2016-01-14
    相关资源
    最近更新 更多