qt用以后继承了QObject的类用QKeyEvent事件。当W按下时启动子线程来实现人物从584跳跃到500并下落至584,跳跃是由快到慢,下落是匀速的。请全程注释
时间: 2023-06-24 22:04:12 浏览: 77
以下是Qt的代码实现,注释已经写在代码中:
```cpp
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCore/QThread>
#include <QtGui/QKeyEvent>
class JumpThread : public QThread
{
public:
void run() override
{
// 跳跃过程
for (int y = 584; y >= 500; y--)
{
emit updatePosition(0, y);
// 模拟快到慢的跳跃过程
msleep(20 * (584 - y) / 84);
}
// 下落过程
for (int y = 500; y <= 584; y++)
{
emit updatePosition(0, y);
// 模拟匀速下落过程
msleep(10);
}
}
signals:
void updatePosition(int x, int y);
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = Q_NULLPTR)
{
// 设置窗口大小
setFixedSize(800, 800);
// 设置窗口背景颜色
setStyleSheet("background-color: #FFFFFF;");
// 初始化人物位置
m_x = 400;
m_y = 584;
}
protected:
// 重写键盘按下事件
void keyPressEvent(QKeyEvent *event) override
{
// 判断是否按下 W 键
if (event->key() == Qt::Key_W)
{
// 创建子线程并启动
JumpThread *thread = new JumpThread;
connect(thread, &JumpThread::updatePosition, this, &MainWindow::onUpdatePosition);
thread->start();
}
}
// 更新人物位置的槽函数
void onUpdatePosition(int x, int y)
{
m_x = x;
m_y = y;
update();
}
// 重写绘制事件
void paintEvent(QPaintEvent *event) override
{
Q_UNUSED(event);
// 绘制人物
QPainter painter(this);
painter.drawImage(m_x, m_y, QImage(":/image/player.png"));
}
private:
int m_x;
int m_y;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#include "main.moc"
```
其中,`JumpThread` 为继承自 `QThread` 的子线程类,用于实现跳跃和下落过程。`MainWindow` 为主窗口类,用于显示人物和处理键盘事件,并将子线程的更新信号连接到更新人物位置的槽函数中。在 `keyPressEvent` 函数中,判断是否按下 W 键,如果按下,则创建子线程并启动。在 `paintEvent` 函数中,绘制人物的位置由 `m_x` 和 `m_y` 决定。
阅读全文