Qt 中实现某个界面的震动,界面可以继承 QWidget, QDialog, QMainWindow, 都可以
QWidget 单独出现显示为一个窗口,若在其他 QDialog 或 QMainWindow 中,则为界面的一个控件,会和父类窗口合为一体。
QDialog 为对话框,右上角窗口只显示 ? 和 x 关闭
- QMainWindow 为程序主界面,右上角为完整的三个键,最小化,最大化和关闭,界面包含主界面(QCentralWidget),菜单栏 (QMenuBar),状态栏 (QStatusBar), 工具栏...
这里以 QWidget 为示例,QWidget 中添加槽函数
class Widget : public QWidget
{
//...
public slots:
void slotVibrate();
};
源文件中需要使用 <QPropertyAnimation> 库,包含对应头文件
#include<QPropertyAnimation> // 包含头文件
需要使用到
setDuration 设置持续时长
setLoopCount 设置循环次数
QPropertyAnimation *animation = new QPropertyAnimation(this, "viber");
animation->setDuration(500);
animation->setLoopCount(2);
主要需要使用 setKeyValueAt
第一个参数为 0-1 ,0 为初始时间, 1 为结束时间, 0.1-0.9 为中间的时间。
第二个参数为值,我们这里使用 QPoint 来表示坐标。
例:
// 设置初始值为 50
animation->setKeyValueAt(0, 50);
// 中间时刻时,值变化到 20
animation->setKeyValueAt(0.5, 20);
// 从 20 到结束时,值变为 60
animation->setKeyValueAt(1, 60);
完整代码为:
#include<QPropertyAnimation>
//...
void Widget::slotVibrate()
{
QPropertyAnimation *animation = new QPropertyAnimation(this, "viber");
animation->setDuration(500);
animation->setLoopCount(2);
animation->setKeyValueAt(0 , QPoint(geometry().x() - 3, geometry().y() - 3));
animation->setKeyValueAt(0.1, QPoint(geometry().x() + 6, geometry().y() + 6));
animation->setKeyValueAt(0.2, QPoint(geometry().x() - 6, geometry().y() + 6));
animation->setKeyValueAt(0.3, QPoint(geometry().x() + 6, geometry().y() - 6));
animation->setKeyValueAt(0.4, QPoint(geometry().x() - 6, geometry().y() - 6));
animation->setKeyValueAt(0.5, QPoint(geometry().x() + 6, geometry().y() + 6));
animation->setKeyValueAt(0.6, QPoint(geometry().x() - 6, geometry().y() + 6));
animation->setKeyValueAt(0.7, QPoint(geometry().x() + 6, geometry().y() - 6));
animation->setKeyValueAt(0.8, QPoint(geometry().x() - 6, geometry().y() - 6));
animation->setKeyValueAt(0.9, QPoint(geometry().x() + 6, geometry().y() + 6));
animation->setKeyValueAt(1 , QPoint(geometry().x() - 3, geometry().y() - 3));
animation->start(QAbstractAnimation::DeleteWhenStopped); // 设置震动结束删除
}