【发布时间】:2025-12-04 22:30:02
【问题描述】:
我正在尝试学习 Qt,并且我正在尝试通过制作一个小游戏来做到这一点。目前我有一个代表游戏板的二维数组。
这个二维数组每秒都会被一个线程更改(代表时间的流逝),然后这个线程会发出一个信号,告诉主 GUI 根据新的游戏板进行更新。
我的帖子如下:
gamethread.h
#ifndef GAMETHREAD_H
#define GAMETHREAD_H
#include <QtCore>
#include <QThread>
#include<QMetaType>
class GameThread : public QThread
{
Q_OBJECT
public:
explicit GameThread(QObject *parent = 0);
void run();
private:
int board[20][10]; //[width][height]
void reset();
signals:
void TimeStep(int board[20][10]);
};
#endif // GAMETHREAD_H
gamethread.cpp
#include "gamethread.h"
#include <QtCore>
#include <QtDebug>
//Game Managment
GameThread::GameThread(QObject *parent) :
QThread(parent)
{
reset();
}
void GameThread::reset()
{
...
}
//Running The Game
void GameThread::run()
{
//Do Some Stuff
emit TimeStep(board);
}
应该接收信号并根据新板更新的主 UI 是:
俄罗斯方块.h
#ifndef TETRIS_H
#define TETRIS_H
#include <QMainWindow>
#include "gamethread.h"
namespace Ui{
class Tetris;
}
class Tetris : public QMainWindow
{
Q_OBJECT
public:
explicit Tetris(QWidget *parent = 0);
~Tetris();
GameThread *mainThread;
private:
Ui::Tetris *ui;
private slots:
int on_action_Quit_activated();
void on_action_NewGame_triggered();
public slots:
void onTimeStep(int board[20][10]);
};
#endif // TETRIS_H
俄罗斯方块.cpp
#include <QMessageBox>
#include <QtGui>
#include <boost/lexical_cast.hpp>
#include <string>
#include "tetris.h"
#include "ui_tetris.h"
Tetris::Tetris(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Tetris)
{
ui->setupUi(this);
mainThread = new GameThread(this);
connect(mainThread, SIGNAL(TimeStep(int[20][10])),
this, SLOT(onTimeStep(int[20][10])),
Qt::QueuedConnection);
}
Tetris::~Tetris()
{
delete ui;
}
void Tetris::onTimeStep(int board[20][10])
{
//receive new board update my display
}
void Tetris::on_action_NewGame_triggered()
{
mainThread->start();
}
当我运行它时,我得到:
QObject::connect: 不能对类型为“int[20][10]”的参数进行排队 (确保使用 qRegisterMetaType() 注册 'int[20][10]'。)
我已经研究了 qRegisterMetaType 和 Q_DECLARE_METATYPE,但我什至不确定如何使用它们,或者即使我必须使用它们。有人可以给QT新手一些帮助吗?
【问题讨论】:
-
您是否尝试过像这样传递二维数组:“int **”
-
其实没有,我没有。你能在信号中传递指针吗?
-
谢谢布雷迪,我会试一试的。有时最简单的解决方案可能确实是最简单的。
-
@Brady
int **与int [20][10]很不一样。 -
@quinmars,确实是这样,一个是固定大小,另一个是可变大小。我建议按照我在下面的回答中提到的那样封装它。
标签: c++ multithreading qt signals