如何对 QGraphicsGridLayout 进行动画处理?



我有一个QGraphicsGridLayout,里面有许多QGraphicsLayoutItems。 我想折叠,即在单击QGraphicsGrid项目之一时缩小QGraphicsGridLayout。 看起来我应该使用QPropertyAnimate函数,但这仅适用于QObjects。 有谁知道这个问题的解决方案? W

所有可以移动、调整大小、重新着色等的东西,无论它是否是QObject的子类,都可以使用 QVariantAnimation 进行动画处理。我已经对QStandardItem(如我的这个例子(和QGraphicsItem进行了测试,没有问题。

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

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

主窗口.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

主窗口.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());
}

可能这段代码不能解决你的整个问题,顺便说一下,由于缺乏代码示例和详细的描述,这个问题很难完全理解。但是,它回答了标题中的问题,可以作为您进一步试验的良好起点。

相关内容

  • 没有找到相关文章

最新更新