16

Qtプログラミングの非常に新しい私はXMLファイルから取得しているQtTableViewでデータを表示したいと思います。

カスタムモデルを作成してTableViewにバインドする方法に関する有用なチュートリアルが見つかりません。

助けを提供するか、誰かが良い例を持っているなら共有してください。

ありがとう

4

3 に答える 3

27

Qt のモデル ビュー アプローチは非常に用途が広いです。すべてのモデルはQAbstractItemModelを継承しています。このクラスを使用すると、非常に複雑なデータ レイアウト (リスト、ツリー、テーブルなど) を作成できますが、実装にかかる労力も比較的大きくなります。

すぐに使用できるクラスはQStandardItemModel. テーブル モデルを簡単に作成し、 のインスタンスである項目を追加できますQStandardItem。次のコードを使用して開始できます。

#include <QtGui>

QStandardItemModel* createModel(QObject* parent)
{
    const int numRows = 10;
    const int numColumns = 10;

    QStandardItemModel* model = new QStandardItemModel(numRows, numColumns);
    for (int row = 0; row < numRows; ++row)
    {
        for (int column = 0; column < numColumns; ++column)
        {
            QString text = QString('A' + row) + QString::number(column + 1);
            QStandardItem* item = new QStandardItem(text);
            model->setItem(row, column, item);
        }
     }

    return model;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow window;
    QTableView* view = new QTableView;
    view->setModel(createModel(view));
    window.setCentralWidget(view);
    window.show();

    return app.exec();
}

ほら、本当に使いやすいです。ただし、欠点は、 を介してデータを提供する必要があることですQStandardItem。これは、メモリの無駄になる可能性があります。たとえば、ビューに表示したい 100MB のデータがいくつかあるとします。QStandardItemすでにデータがどこかに保存されているので、すべてのセルを作成するのではなく、ビューで使用できるように調整することをお勧めします。

ここでQAbstractTableModel出番です。次の例では、250.000 エントリのマトリックスを作成します。QStandardItem行列要素ごとに1 つ作成する代わりにQAbstractTableModel、3 つの純粋仮想メソッド numRows()numColumns()およびをサブクラス化して実装data()します。これらは、表示する行数、列数、およびデータを返します。

#include <QtGui>

class MatrixModel : public QAbstractTableModel
{
public:
    MatrixModel(int numRows, int numColumns, double* data)
        : m_numRows(numRows),
          m_numColumns(numColumns),
          m_data(data)
    {
    }

    int rowCount(const QModelIndex& parent = QModelIndex()) const
    {
        return m_numRows;
    }

    int columnCount(const QModelIndex& parent = QModelIndex()) const
    {
        return m_numColumns;
    }

    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const
    {
        if (!index.isValid() || role != Qt::DisplayRole)
            return QVariant();

        // Return the data to which index points.
        return m_data[index.row() * m_numColumns + index.column()];
    }

private:
    int m_numRows;
    int m_numColumns;
    double* m_data;
};


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // Create a matrix.
    const int numRows = 500;
    const int numColumns = 500;
    double matrix[numRows][numColumns];
    for (int i = 0; i < numRows; ++i)
        for (int j = 0; j < numColumns; ++j)
            matrix[i][j] = i + j;

    // Create a model which adapts the data (the matrix) to the view.
    MatrixModel model(numRows, numColumns, (double*)matrix);

    QMainWindow window;
    QTableView* view = new QTableView;
    view->setModel(&model);
    window.setCentralWidget(view);
    window.show();

    return app.exec();
}

ご覧のとおり、モデルはデータを複製せず、アダプターとしてのみ機能します。さらに柔軟性が必要な場合はQAbstractItemModel、Qt がどのモデル データを読み書きするかを指定するために使用するモデル インデックスの作成を実装することができます。

于 2012-08-10T18:12:48.423 に答える
1

これでおそらく始められるはずです。http://doc.qt.io/qt-5/modelview.html

于 2012-08-10T18:00:42.580 に答える
1

絶えず変化する XML ソースからアクティブに読み取り、更新できるようにするため、カスタム モデルが必要ですか?

そうでない場合は、通常の QTableView チュートリアルとQStandardItemModelを使用できます。XML ファイルを自分で解析し、QStandardItemオブジェクトを作成してモデルに追加します。

カスタム モデルは、XML ファイルの読み取りをモデル自体に直接統合する方法であり、外部から入力する項目ベースのアプローチとは対照的です。

于 2012-08-10T18:04:44.843 に答える