0

私は Qt のモデル/ビュー フレームワークの初心者です。QAbstractTableModel サブクラス (MyModel) を QTableView で使用すると問題が発生します。MyModel オブジェクトを作成した後、2 行と 2 列に設定したいと思います。すべてのクラス変数を設定してから dataChanged() SIGNAL を発行する初期化関数がありますが、それでもビューには何も表示されません。

class MyModel : QAbstractTableModel
{
     public:
       MyModel();
       Initialise(double **a, int r, int c);

     private:
       int row;
       int column;
       double **array;
}

MyModel::Initialise(double **a, int r, int c)
{
     array = a;
     row = r;
     column = c;
     emit dataChanged(index(0, 0), index(r - 1, c - 1));
}

読み取り専用アクセスに必要なすべての機能を再実装しました。しかし、まだ空白のウィンドウが表示されます。上記のコードは説明のためにメモ帳で作成したものなので、構文エラーは無視してください。QAbstractTableModel からカスタム モデルを作成するための Qt SDK の例が見つかりませんでした。データをモデルに初期化する正しい方法を教えてください。

編集:

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();//currently it is returning from here, why???

    switch(role)
    {
        case Qt::DisplayRole:
        {
        if(index.column()==0)
            return QString::number(array[index.row()][index.column()]);
        break;
        }
    }
}
4

2 に答える 2

4

dataChangedシグナルは、ビューに既存のアイテムを強制的に更新させます。行数または列数が変更されたことは通知されません。layoutAboutToBeChanged代わりにandlayoutChangedシグナルを使用する必要があります。パラメータなしで使用できます。

仮想機能を適切に実装rowCountしたことを確認してください。columnCount

index.isValid()あなたの関数でなぜ falseなのかわかりません。インデックスのmodel()row()およびcolumn()プロパティをチェックして、有効でない理由を正確に調べてください。通常、ビューdataは任意の引数で関数を呼び出すことができます。ビューはモデルが空であると考えているため、すべてのインデックスが無効である可能性が高くなります。ビューに行と列が表示されると、有効なインデックスを受け取り始めます。

また、初期化が 1 回だけ実行される場合は、モデルをビューに割り当てる前に実行することをお勧めします。

そして使用しないでくださいdouble**QVector代わりに、自動メモリ管理 (例: ) を使用してください。結局のところ、それは C++ です。

于 2013-10-12T11:27:43.907 に答える