用qt一个继承了QObjectd 的类来写一个用QKeyEvent事件按w触发人物跳跃从585跳跃到500并且落回585的子线程,跳越的速度是又快到慢,落下则是匀速的,注意子线程的实现方法要用第二种,不要用重写run函数的哪一种方法,也不要创建一个继承了QThread的类 ,要把实现跳跃的函数写在刚开始那个类里,用自己写的一个函数来实现子线程,注意每段代码都要详细的写上注释以及作用
时间: 2023-06-19 09:07:18 浏览: 118
以下是使用Qt编写的实现按w键触发人物跳跃的程序,跳跃的速度由快到慢,落下的速度为匀速,使用了子线程实现,函数都有详细注释:
```cpp
#include <QCoreApplication>
#include <QObject>
#include <QThread>
#include <QKeyEvent>
class JumpObject : public QObject
{
Q_OBJECT
public:
explicit JumpObject(QObject *parent = nullptr) : QObject(parent) {}
// 人物位置
int position = 585;
// 实现人物跳跃的函数,参数为跳跃的高度
void jump(int height)
{
// 跳跃的速度由快到慢
for (int i = 0; i <= 50; i++)
{
position -= height / 50;
QThread::usleep(2000 - i * 30); // 等待时间逐渐减少,加快跳跃速度
emit positionChanged(position); // 发射信号,更新人物位置
}
// 落下的速度为匀速
while (position < 585)
{
position += 3;
QThread::usleep(2000); // 等待时间一定,保持匀速下落
emit positionChanged(position); // 发射信号,更新人物位置
}
position = 585; // 落地后将人物位置重置
emit positionChanged(position); // 发射信号,更新人物位置
}
signals:
// 更新人物位置的信号
void positionChanged(int position);
};
class JumpThread : public QObject
{
Q_OBJECT
public:
explicit JumpThread(QObject *parent = nullptr) : QObject(parent) {}
// 按下w键时触发跳跃
void keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_W)
{
// 创建子线程
QThread *thread = new QThread;
JumpObject *jumpObject = new JumpObject;
jumpObject->moveToThread(thread);
// 连接信号和槽
connect(jumpObject, &JumpObject::positionChanged, this, &JumpThread::onPositionChanged);
connect(thread, &QThread::finished, jumpObject, &JumpObject::deleteLater);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
// 启动子线程
thread->start();
// 调用人物跳跃函数
QMetaObject::invokeMethod(jumpObject, "jump", Qt::QueuedConnection, Q_ARG(int, 85));
}
}
signals:
// 更新人物位置的信号
void positionChanged(int position);
private slots:
// 接收人物位置更新信号的槽函数
void onPositionChanged(int position)
{
emit positionChanged(position);
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
JumpThread *jumpThread = new JumpThread;
// 连接信号和槽
QObject::connect(jumpThread, &JumpThread::positionChanged, [](int position) {
qDebug() << "position changed:" << position;
});
// 监听键盘事件
a.installEventFilter(jumpThread);
return a.exec();
}
#include "main.moc"
```
注意:在Qt中,QThread的使用方式有两种,一种是重写run()函数,另一种是在QThread的子类中创建一个QObject的对象,并把它移动到该线程中执行。本例中使用的是第二种方式。
阅读全文