在 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
};

这可能不是最有效的方法,但如果您只需要两种颜色,效果很好。