用qt一个继承了QObjectd 的类来写一个用QKeyEvent事件按w触发人物跳跃从585跳跃到500并且落回585的子线程,跳越的速度是又快到慢,落下则是匀速的,注意子线程的实现方法要用第二种,不要用重写run函数的哪一种方法,用自己写的一个函数来实现子线程
时间: 2023-06-20 13:06:24 浏览: 93
好的,以下是一个简单的实现:
```cpp
// jumpthread.h
#ifndef JUMPTHREAD_H
#define JUMPTHREAD_H
#include <QObject>
#include <QThread>
#include <QKeyEvent>
class JumpThread : public QThread
{
Q_OBJECT
public:
explicit JumpThread(QObject *parent = nullptr);
void jump();
signals:
void positionChanged(int y);
protected:
void run() override;
private:
int m_y;
};
#endif // JUMPTHREAD_H
// jumpthread.cpp
#include "jumpthread.h"
JumpThread::JumpThread(QObject *parent) : QThread(parent), m_y(585)
{
}
void JumpThread::jump()
{
for (int i = 0; i < 50; ++i) {
m_y -= 7;
emit positionChanged(m_y);
msleep(20);
}
for (int i = 0; i < 50; ++i) {
m_y += 7;
emit positionChanged(m_y);
msleep(20 + i * 2);
}
m_y = 585;
emit positionChanged(m_y);
}
void JumpThread::run()
{
// 不使用重写 run 函数的方法
// 在外部通过调用 jump 函数来触发跳跃
}
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "jumpthread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
JumpThread m_thread;
private slots:
void onPositionChanged(int y);
void onKeyPressed(QKeyEvent *event);
};
#endif // MAINWINDOW_H
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 子线程结束后自动销毁
m_thread.setObjectName("JumpThread");
m_thread.start();
// 连接信号和槽
connect(&m_thread, &JumpThread::positionChanged,
this, &MainWindow::onPositionChanged);
connect(ui->lineEdit, &QLineEdit::returnPressed,
this, &MainWindow::onKeyPressed);
}
MainWindow::~MainWindow()
{
m_thread.quit();
m_thread.wait();
delete ui;
}
void MainWindow::onPositionChanged(int y)
{
ui->label->move(ui->label->x(), y);
}
void MainWindow::onKeyPressed(QKeyEvent *event)
{
if (event->key() == Qt::Key_W) {
m_thread.jump();
}
}
```
其中,`JumpThread` 类继承自 `QThread`,并且在 `jump` 函数中实现了跳跃的逻辑。该函数通过发射信号 `positionChanged` 来通知主线程更新人物的位置。
在 `MainWindow` 中,我们启动了一个 `JumpThread` 线程,并且连接了其 `positionChanged` 信号和槽函数 `onPositionChanged`。在 `onKeyPressed` 槽函数中,我们检查按下的键是否为 W 键,如果是,则调用 `JumpThread` 的 `jump` 函数来触发跳跃。
需要注意的是,因为 `JumpThread` 继承自 `QObject`,所以我们在其构造函数中为其指定了父对象,这样在主线程结束时,该线程也会被自动销毁。同时,我们也没有使用重写 `run` 函数的方法,而是在外部通过调用 `jump` 函数来触发跳跃。这样做的好处是,可以更好地控制子线程的生命周期,同时也可以避免一些潜在的问题。
阅读全文