将 2d 数组及其值从 c++ 文件显示到 qml 文件中

问题描述 投票:0回答:1

我有这个 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")
}
c++ arrays qt qml
1个回答
0
投票

以下是我过去使用过的一些解决方案。

  1. QVariant/QVariantList

为了降低进入门槛,请通过

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 必须在应用新模型之前拆除以前的模型,这可能会导致闪烁。

  1. 考虑整理一维单元列表:
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++ 数据结构是一维的,也可以以图形方式表示组件。

© www.soinside.com 2019 - 2024. All rights reserved.