我有一个带有多个QGraphicsLayoutItems的QGraphicsGridLayout。我想折叠,即单击QGraphicsGrid项之一时缩小QGraphicsGridLayout。似乎我应该使用QPropertyAnimate函数,但这仅适用于QObjects。有人知道这个问题的解决方案吗? W
答案 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());
}
由于缺少代码示例和详细说明,因此这段代码可能无法解决您的整个问题,因此很难完全理解。但是,它回答了标题中的问题,可以作为您进一步尝试的一个很好的起点。