我有这个 C++ 编码的 9 x 9 2d 数组,我想在 qml 文件中显示它。我怎样才能做到这一点? 这是cpp文件:
#include "SudokuModel.h"
SudokuModel::SudokuModel(QObject *parent) : QObject(parent)
{
sudokuMatrix = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
}
int SudokuModel::getValue(int row, int col) const
{
return sudokuMatrix[row][col];
}
这是它的标题:
#ifndef SUDOKUMODEL_H
#define SUDOKUMODEL_H
#include <QObject>
#include <QList>
class SudokuModel : public QObject
{
Q_OBJECT
public:
explicit SudokuModel(QObject *parent = nullptr);
Q_INVOKABLE int getValue(int row, int col) const;
private:
QList<QList<int>> sudokuMatrix;
};
#endif
这是 qml 文件,我想在其窗口中显示矩阵:
import QtQuick
import QtQuick.Window
import QtQuick.Controls 6.0
Window {
width: 1920
height: 1080
visible: true
title: qsTr("New Game")
}
以下是我过去使用过的一些解决方案。
为了降低进入门槛,请通过
QVariantList
整理整个模型。在这种情况下,由于您想要二维,所以会是这样的:
QVariant Sudoku::GetValues() const
{
QVariantList matrix;
for (int r = 0; r < m_rows; r++)
{
QVariantList row;
for (int c = 0; c < m_cols; c++)
{
row.append(sudokuMatrix[r][c]);
}
matrix.append(row);
}
return matrix;
}
这种方法的问题在于,即使只有 1 个单元格发生了变化,您也必须传输整个矩阵。因此,存在性能问题,也存在潜在的 UI/UX 问题,因为当用作模型时,UI/UX 必须在应用新模型之前拆除以前的模型,这可能会导致闪烁。
public class SudokuCell : public QObject
{
public:
Q_PROPERTY(int row MEMBER m_row NOTIFY rowChanged);
Q_PROPERTY(int col MEMBER m_col NOTIFY colChanged);
Q_PROPERTY(int value MEMBER m_value NOTIFY valueChanged);
signals:
void rowChanged();
void colChanged();
void valueChanged();
protected:
int m_row;
int m_col;
int m_value;
};
然后,您可以通过
QVariantList
(类似于 1)或通过 QQmlListProperty
提供这些列表。这样做,您可以使列表静态,但让它对任何单元格上的单个值更改做出反应。这将大大减少闪烁,而且,您还可以将此类列表与各种 UI/UX 组件一起使用,最简单的是,Repeater
,其中 row
和 value
可用于配置您的 2D 性质。即使 C++ 数据结构是一维的,也可以以图形方式表示组件。