如何设置QGraphicsGridLayout的动画?

时间:2018-08-15 19:55:36

标签: qt animation graphics

我有一个带有多个QGraphicsLayoutItems的QGraphicsGridLayout。我想折叠,即单击QGraphicsGrid项之一时缩小QGraphicsGridLayout。似乎我应该使用QPropertyAnimate函数,但这仅适用于QObjects。有人知道这个问题的解决方案吗? W

1 个答案:

答案 0 :(得分:0)

所有可以移动,调整大小,重新着色等的东西,无论它是否是 QObject 的子类,都可以使用How do I remove newlines from a text file?进行动画处理。我已经对QVariantAnimation(如QStandardItem)和this example of mine进行了测试。

诀窍是根据valueChanged信号采取行动,并对动画对象进行任何您想做的事情。 const QVariant &value为您提供了动画的当前值,因此,例如,如果您已将起始值和结束值分别设置为0和100,并在回调函数中编写了my_rect->setPos(value.toInt(), my_rect.y())之类的内容,则将从位置(0,y)到(100,y)的水平矩形my_rect

对于 QGraphicsGridLayout 的情况,您应该操作设置为它的 QGraphicsWidget 对象。这是按下按钮时整个网格布局的动态水平收缩的示例:

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QPushButton;
class QGraphicsWidget;

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);

private:
    QPushButton *m_button;
    QGraphicsWidget *m_form;

private slots:
    void onButtonClicked();
    void onValueChanged(const QVariant &value);
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include <QTextEdit>
#include <QPushButton>
#include <QGraphicsView>
#include <QVariantAnimation>
#include <QGraphicsGridLayout>
#include <QGraphicsProxyWidget>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    m_button(new QPushButton(tr("Shrink me"))),
    m_form(new QGraphicsWidget())
{
    auto *view = new QGraphicsView(this);
    auto *layout = new QGraphicsGridLayout();

    view->setScene(new QGraphicsScene(this));

    layout->addItem(view->scene()->addWidget(new QTextEdit()), 0, 0);
    layout->addItem(view->scene()->addWidget(m_button), 0, 1);

    m_form->setLayout(layout);

    view->scene()->addItem(m_form);

    setCentralWidget(view);
    resize(800, 600);

    connect(m_button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
}

void MainWindow::onButtonClicked()
{
    auto *animation = new QVariantAnimation(this);

    m_button->setDisabled(true);

    animation->setStartValue(m_form->geometry().width());
    animation->setEndValue(0.0);
    animation->setDuration(1500);

    connect(animation, &QVariantAnimation::valueChanged, this, &MainWindow::onValueChanged);

    animation->start(QAbstractAnimation::DeleteWhenStopped);
}

void MainWindow::onValueChanged(const QVariant &value)
{
    m_form->resize(value.toDouble(), m_form->geometry().height());
}

由于缺少代码示例和详细说明,因此这段代码可能无法解决您的整个问题,因此很难完全理解。但是,它回答了标题中的问题,可以作为您进一步尝试的一个很好的起点。