- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当使用 QVboxLayout 排列小部件时,我想使用 QPropertyAnimation 增加小部件的高度。问题是,当我打开多个小部件时,它们会在动画期间开始移动/摇动。
我在这里准备了最小的工作示例 tar gz project当您按下第一个、第二个、第三个小部件的“打开”按钮时出现问题,然后您可以看到它们在摇晃,在“打开”动画期间略微上下移动。
有人知道如何避免这种情况吗?我可以在主布局上设置 setSizeConstraint(QLayout::SetFixedSize) 并且它们不会抖动,但是然后调整大小和其他不起作用。
最好的问候
马立克
最佳答案
前段时间我写了一个布局,它为它包含的小部件位置设置动画。您应该以这样的方式构建您的布局,即每个应该动画的小部件都应该在此布局内(每个应该动画的小部件一个 AnimLayout
):
#include <QLayout>
QT_FORWARD_DECLARE_CLASS(QPropertyAnimation)
class AnimLayout : public QLayout
{
Q_OBJECT
Q_PROPERTY(QPoint delta
READ delta
WRITE setDelta
NOTIFY deltaChanged)
Q_PROPERTY(QRect widgetRect
READ widgetRect
WRITE setWidgetRect
NOTIFY widgetRectChanged)
Q_PROPERTY(bool active
READ isDeltaActive
WRITE setDeltaActive
NOTIFY deltaActiveChanged)
public:
explicit AnimLayout(QWidget *parent = 0);
~AnimLayout();
QPoint delta() const;
void setDelta(const QPoint &value);
QSize sizeHint() const;
void setGeometry(const QRect &);
QSize minimumSize() const;
int count() const;
QSize deltaSize() const;
QRect widgetRect() const;
void setWidgetRect(const QRect &value);
bool isDeltaActive() const;
void setDeltaActive(bool active = true);
void updateItemPosition();
private:
void addItem(QLayoutItem *item);
QLayoutItem *itemAt(int index) const;
QLayoutItem *takeAt(int index);
signals:
void deltaChanged(const QPoint &value);
void widgetRectChanged(const QRect &value);
void deltaActiveChanged(bool active);
public slots:
void testIt();
private:
QLayoutItem *item;
QPropertyAnimation *animation;
QPoint mDelta;
bool mDeltaActive;
};
///////////////////////////////////////////////////////////
#include "animlayout.h"
#include <QPropertyAnimation>
AnimLayout::AnimLayout(QWidget *parent) :
QLayout(parent) ,
item(0)
{
animation = new QPropertyAnimation(this);
animation->setPropertyName("widgetRect");
animation->setDuration(400);
animation->setTargetObject(this);
mDeltaActive = false;
}
AnimLayout::~AnimLayout()
{
delete item;
}
QPoint AnimLayout::delta() const
{
return mDelta;
}
void AnimLayout::setDelta(const QPoint &value)
{
if (mDelta != value) {
mDelta = value;
emit deltaChanged(mDelta);
invalidate();
}
}
void AnimLayout::addItem(QLayoutItem *newItem)
{
Q_ASSERT(!item);
animation->stop();
item =newItem;
emit widgetRectChanged(item->geometry());
invalidate();
}
QSize AnimLayout::sizeHint() const
{
if (!item)
return QSize();
QSize result(item->sizeHint());
result += deltaSize();
int m = 2*margin();
result += QSize(m,m);
return result;
}
void AnimLayout::updateItemPosition()
{
QRect dest = contentsRect();
QPoint d = delta();
if (isDeltaActive()) {
d = -d;
}
if (d.x()!=0) {
if (d.x()>0) {
dest.setLeft(dest.left()+d.x());
} else {
dest.setRight(dest.right()+d.x());
}
}
if (d.y()) {
if (d.y()>0) {
dest.setTop(dest.top()+d.y());
} else {
dest.setBottom(dest.bottom()+d.y());
}
}
animation->setEndValue(dest);
if (widgetRect()!=dest) {
animation->start();
}
}
void AnimLayout::setGeometry(const QRect &rect)
{
QLayout::setGeometry(rect);
updateItemPosition();
}
QLayoutItem *AnimLayout::itemAt(int i) const
{
return i==0?item:0;
}
QLayoutItem *AnimLayout::takeAt(int i)
{
Q_ASSERT(i==0);
QLayoutItem *r = item;
item = 0;
return r;
}
void AnimLayout::testIt()
{
setDeltaActive(!isDeltaActive());
}
QRect AnimLayout::widgetRect() const
{
if (item)
return item->geometry();
return QRect();
}
void AnimLayout::setWidgetRect(const QRect &value)
{
if (item && item->geometry()!=value) {
item->setGeometry(value);
emit widgetRectChanged(item->geometry());
}
}
bool AnimLayout::isDeltaActive() const
{
return mDeltaActive;
}
void AnimLayout::setDeltaActive(bool active)
{
if (active!=mDeltaActive) {
mDeltaActive = active;
animation->stop();
updateItemPosition();
emit deltaActiveChanged(active);
}
}
QSize AnimLayout::minimumSize() const
{
QSize result(deltaSize());
if (item) {
result += item->minimumSize();
}
int m = 2*margin();
result += QSize(m,m);
return result;
}
int AnimLayout::count() const
{
return item?1:0;
}
QSize AnimLayout::deltaSize() const
{
return QSize(qAbs(mDelta.x()), qAbs(mDelta.y()));
}
它有一些您不需要的额外功能 (mDelta
)。
关于c++ - Qt QPropertyAnimation for widgets in layout - widgets shaking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486336/
Shake 有 shakeVersion::String: Defaults to 1. The version number of your build rules. Change the vers
由于各种不幸的原因,我的部分构建需要 root 权限。我正在尝试使用 sudo为了这: cmd_ "sudo other_script.sh" [input] [output] 但是,大概是因为 Sh
我将 Xcode 更新到 9.0,现在 ⌘R 不再可以在 iOS 模拟器中重新加载应用程序,并且 ⌘D 不再打开开发者菜单。 开发者菜单的新快捷方式是 ^⌘Z,并且不再有重新加载应用程序的快捷方式。
我正在为我的应用程序开发简单的摇一摇功能,但我遇到了一个奇怪的问题。当我在我的 Honor5x 上测试它时,它就像一个魅力,但当我试图在三星 S5 上执行它时,它太敏感了。加速度计在不同设备上的工作方
我先找到example Shake 用法演示了一种似乎容易出错的模式: contents "txt" need contents cmd "tar -cf" [out] co
我正在使用 animate.css 实现 CSS3 摇动效果,CSS 看起来像下面的代码片段。现在它来回摇晃了好几次,我想把摇晃减半。有没有办法用 animate css3 来做到这一点,或者我需要修
我从 "Running" section of the Shake manual 创建了推荐的 build.sh 文件: #!/bin/sh mkdir -p _shake ghc --make Sh
我的应用程序上有一个可以由用户调整大小的控件,它有一些按钮固定在右上角,还有一个滚动条。 问题在于,当调整控件大小时,锚定在右侧的控件也会更改位置,并且仅在几毫秒后控件才进入正确位置。因此,看起来子控
我希望我的应用随时启动 Activity 以响应手机的“摇动”。 是否建议在后台持续运行一个服务来监听加速度计的变化? 有没有其他方法可以做到这一点? 有很多应用可以执行此类操作。 最佳答案 是的,使
我有一个构建两组目标的项目。一种是手持设备的各种版本的固件,最终为每个设备创建一个 .dfu 文件。这使用了 arm 编译链。另一组是为构建平台编译代码的相同设备的模拟器(嗯,通常无论如何)。我继承的
我有这样的规则: "foo" *> \out do need something create "foo" somehow 构建正确,运行构建两次不会构建目标。然后我向这条规则添加一个系统:
在 Puppet/Chef 的脉络中;我真的很想将 Shake 用于不仅仅是本地构建。我认为 Shake 的原理足够抽象(虽然我没有深入研究过),可以将其用作更大的配置构建工具的基础。 最佳答案 免责
我对规则感到困惑 Shake用于确定输出是否需要重建。我有一个简单的文档构建,包含两个步骤。完整的构建文件如下,但总而言之,asciidoc 用于将 .txt 文件转换为 .dbxml(Docbook
使用 jQuery UI 的抖动效果会导致元素跑到换行符处,抖动,然后跑回来。我尝试改变CSS的位置等,但没有破解它,我觉得有一个正常的,优雅的解决方案。 http://jsfiddle.net/Sh
在iPhone App中如何实现摇动手势? 请帮忙并提出建议。 谢谢 最佳答案 如果您的 ViewController 启用第一响应者 [self becomeFirstResponder] 并实现m
在 Shake 文档中,它建议使用标志 -with-rtsopts=-I0 进行编译。禁用空闲垃圾收集。为什么Shake建议这样做? 最佳答案 默认情况下(不带标志)如果所有 Haskell 线程空闲
我正在尝试了解如何使用 Shake 以及如何构建新规则。作为练习,我决定实现我称之为 backup 的规则。 我们的想法是在文件不存在或文件太旧(让我们超过 24 小时)时生成一个文件。我喜欢将长命令
我对测试库私有(private)类/函数的简单方法很感兴趣。下面有两个文件用于测试文件 curves_attribution.dart 中的代码。后者 (2) 是 http://pub.dartlan
我想摇动“#error_message”div。我正在做: $('#error_message').effect('shake', {times: 2, distance: 5}, 200); div
我正在尝试制作一个元素,它可以来回摇晃并变小,然后在单击时重置为其原始大小。问题是,当点击时,它似乎经历了尺寸循环,但在第一个之后,它就不再晃动了。如果尝试到处移动功能,但似乎没有任何效果。我的代码中
我是一名优秀的程序员,十分优秀!