在 Qt、C++ 中开发没有 openGL 的迷宫生成器
Developing a maze generator without openGL in Qt, C++
我是 Qt 的新手,想知道如何使用 Qt 生成迷宫?如果是这样,我该如何开始?
如果它只是纯 C++ 编码,我可以简单地从声明我的 2D 数组开始,然后继续编写迷宫代码。
对于这个项目,一切都必须是 GUI 版本,所以这意味着将 2D 数组更改为 GUI。我根本不知道从哪里开始。
我所知道的是,由于这是在 GUI 中,我必须从 Qt 中的 QGraphicsView
开始。然后呢?我是否从那里创建一个二维数组?即使我创建了一个二维数组,我如何将它放入 QGraphicsView
中?我走的方向正确吗?谁能给我一个大概的指导方针?
mazewidget.h
的当前实施试用
#ifndef MAZEWIDGET_H
#define MAZEWIDGET_H
#include <QWidget>
#include "ui_mazewidget.h"
#include <QtGui>
#include <QtCore>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QGraphicsRectItem>
class MazeWidget : public QWidget
{
Q_OBJECT
public:
MazeWidget(QWidget *parent = 0);
~MazeWidget();
void paintEvent(QPaintEvent *event);
void setVec(QList<QList<bool>> const& vec);
private:
Ui::MazeWidget ui;
QList<QList<bool>> vec_;
};
#endif // MAZEWIDGET_H
和mazewidget.cpp
#include "mazewidget.h"
#include "mazeapplication.h"
#include "ui_mazeapplication.h"
MazeWidget::MazeWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
MazeWidget::~MazeWidget()
{
}
void MazeApplication::paintEvent(QPaintEvent *e)
{
QPixmap pixmap(vec_.front().size(), vec_.size()); // pixmap with scale 1:1
QPainter pixmap_painter(&pixmap);
for (int y = 0; y < vec_.size(); y++)
for (int x = 0; x < vec_[y].size(); x++)
{
pixmap_painter.setPen(vec_[y][x] ? QColor("white") : QColor("black"));
pixmap_painter.drawPoint(x, y); // Draw individual pixels
}
QPainter painter(this);
QPixmap pixmap_scaled = pixmap.scaled(size(), Qt::KeepAspectRatio); // scale to fit the widget
painter.drawPixmap(
(width() - pixmap_scaled.width()) / 2,
(height() - pixmap_scaled.height()) / 2,
pixmap_scaled.width(), pixmap_scaled.height(), pixmap_scaled); // draw with alignment in the middle
}
void setVec(QList<QList<bool>> const& vec)
{
vec_ = vec;
// You can pre-paint pixmaps here, if you keep vec_ as value or make a function and keep it updated.
}
您不需要 QGraphicsView
来绘制矩形。继承 QWidget
并覆盖 paintEvent
.
更简单
class MazeWidget : public QWidget
{
public:
MazeWidget(QWidget *parent = 0) :
QWidget(parent)
{
}
void paintEvent(QPaintEvent *event)
{
QPixmap pixmap(vec_.front().size(), vec_.size()); // pixmap with scale 1:1
QPainter pixmap_painter(&pixmap);
for(int y = 0; y < vec_.size(); y++)
for(int x = 0; x < vec_[y].size(); x++)
{
pixmap_painter.setPen(vec_[y][x] ? QColor("white") : QColor("black"));
pixmap_painter.drawPoint(x, y); // Draw individual pixels
}
QPainter painter(this);
QPixmap pixmap_scaled = pixmap.scaled(size(), Qt::KeepAspectRatio); // scale to fit the widget
painter.drawPixmap(
(width() - pixmap_scaled.width()) / 2,
(height() - pixmap_scaled.height()) / 2,
pixmap_scaled.width(), pixmap_scaled.height(), pixmap_scaled); // draw with alignment in the middle
}
void setVec(QList<QList<bool>> const& vec)
{
vec_ = vec;
// You can pre-paint pixmaps here, if you keep vec_ as value or make a function and keep it updated.
}
private:
QList<QList<bool>> vec_; // Consider using reference or pointer
};
这可能不是最有效的方法,但如果您只需要两种颜色,效果很好。
我是 Qt 的新手,想知道如何使用 Qt 生成迷宫?如果是这样,我该如何开始?
如果它只是纯 C++ 编码,我可以简单地从声明我的 2D 数组开始,然后继续编写迷宫代码。
对于这个项目,一切都必须是 GUI 版本,所以这意味着将 2D 数组更改为 GUI。我根本不知道从哪里开始。
我所知道的是,由于这是在 GUI 中,我必须从 Qt 中的 QGraphicsView
开始。然后呢?我是否从那里创建一个二维数组?即使我创建了一个二维数组,我如何将它放入 QGraphicsView
中?我走的方向正确吗?谁能给我一个大概的指导方针?
mazewidget.h
的当前实施试用#ifndef MAZEWIDGET_H
#define MAZEWIDGET_H
#include <QWidget>
#include "ui_mazewidget.h"
#include <QtGui>
#include <QtCore>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QGraphicsRectItem>
class MazeWidget : public QWidget
{
Q_OBJECT
public:
MazeWidget(QWidget *parent = 0);
~MazeWidget();
void paintEvent(QPaintEvent *event);
void setVec(QList<QList<bool>> const& vec);
private:
Ui::MazeWidget ui;
QList<QList<bool>> vec_;
};
#endif // MAZEWIDGET_H
和mazewidget.cpp
#include "mazewidget.h"
#include "mazeapplication.h"
#include "ui_mazeapplication.h"
MazeWidget::MazeWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
MazeWidget::~MazeWidget()
{
}
void MazeApplication::paintEvent(QPaintEvent *e)
{
QPixmap pixmap(vec_.front().size(), vec_.size()); // pixmap with scale 1:1
QPainter pixmap_painter(&pixmap);
for (int y = 0; y < vec_.size(); y++)
for (int x = 0; x < vec_[y].size(); x++)
{
pixmap_painter.setPen(vec_[y][x] ? QColor("white") : QColor("black"));
pixmap_painter.drawPoint(x, y); // Draw individual pixels
}
QPainter painter(this);
QPixmap pixmap_scaled = pixmap.scaled(size(), Qt::KeepAspectRatio); // scale to fit the widget
painter.drawPixmap(
(width() - pixmap_scaled.width()) / 2,
(height() - pixmap_scaled.height()) / 2,
pixmap_scaled.width(), pixmap_scaled.height(), pixmap_scaled); // draw with alignment in the middle
}
void setVec(QList<QList<bool>> const& vec)
{
vec_ = vec;
// You can pre-paint pixmaps here, if you keep vec_ as value or make a function and keep it updated.
}
您不需要 QGraphicsView
来绘制矩形。继承 QWidget
并覆盖 paintEvent
.
class MazeWidget : public QWidget
{
public:
MazeWidget(QWidget *parent = 0) :
QWidget(parent)
{
}
void paintEvent(QPaintEvent *event)
{
QPixmap pixmap(vec_.front().size(), vec_.size()); // pixmap with scale 1:1
QPainter pixmap_painter(&pixmap);
for(int y = 0; y < vec_.size(); y++)
for(int x = 0; x < vec_[y].size(); x++)
{
pixmap_painter.setPen(vec_[y][x] ? QColor("white") : QColor("black"));
pixmap_painter.drawPoint(x, y); // Draw individual pixels
}
QPainter painter(this);
QPixmap pixmap_scaled = pixmap.scaled(size(), Qt::KeepAspectRatio); // scale to fit the widget
painter.drawPixmap(
(width() - pixmap_scaled.width()) / 2,
(height() - pixmap_scaled.height()) / 2,
pixmap_scaled.width(), pixmap_scaled.height(), pixmap_scaled); // draw with alignment in the middle
}
void setVec(QList<QList<bool>> const& vec)
{
vec_ = vec;
// You can pre-paint pixmaps here, if you keep vec_ as value or make a function and keep it updated.
}
private:
QList<QList<bool>> vec_; // Consider using reference or pointer
};
这可能不是最有效的方法,但如果您只需要两种颜色,效果很好。