3

初めての投稿になりますが、プログラミングを始めてから、たくさんの方々にお世話になりました。

私は Qt を初めて使用し、現時点で最初のプロジェクトを作成しようとしています。私の質問は、モデル、基になるデータ、およびビューの間の通信についてです。

私は最初にバックグラウンドのもの (データの保存など) を GUI から分離しました。今、私はテンプレート クラスを持っており、から継承Matrixするテンプレート クラスを作成しました。これは正常に機能しています。つまり、テーブルを編集でき、ビューとモデルのデータで値が更新されます。MatrixModelQAbstractTableModel

ここで私の質問: 新しいメソッドを作成せずにモデル内のデータを変更するにはどうすればよいですか?

メインウィンドウ.cpp:

matrix<int> m = {{1,2,3},{4,5,6},{7,8,9}};
MatrixModel<int>* model = new MatrixModel<int>(m);
QTableView* tableView = new QTableView;
tableView->setModel(model);

m.transpose()モデルの基になるデータを呼び出す方法はありますか? 変更するとどうなりmますか? モデルのデータに影響しますか? 私は多くのことを試しましたが、何もうまくいきませんでした。1 つの「問題」は、テンプレート クラスを使用しているため、標準のシグナル/スロット構文を使用できないことです。

私の最後の試みは、モデルで更新クラスを作成することでした:

template<typename T>
void MatrixModel<T>::updateAll() {
    QModelIndex topLeft = index(0,0);
    QModelIndex bottomRight = index(rowCount()-1, columnCount()-1);
    emit dataChanged(topLeft, bottomRight);
}

そして、それをボタンとラムダ関数に接続しようとしました:

connect(transposeButton, &QPushButton::clicked, [=,&m,&model]() {
m.transpose(); model->updateAll();
});

しかし、ボタンを押すとプログラムがクラッシュするようでした。私は本当に必死です xD あなたが私を助けてくれることを願っています. 詳細が必要な場合は、お気軽にお問い合わせください^^

よろしくお願いします

デニス

編集1:これまでのところ、(あなたの助けを借りて:))、モデルにマトリックスの関数を再度記述し(transpose()など)、そこからデータの変更を発行する必要があることを理解しました(emit dataChangedまたはbeginResetModel(を使用) )...) しかし、データの基礎となるモデルを変更することはできません。私が書いたら

これはメインウィンドウで:

connect(transposeButton, &QPushButton::clicked, [&model]() {
    model->transpose();
});

モデル内のこれ:

template<typename T>
void MatrixModel<T>::transpose() {
    m(0,0) = 5;
}

移調ボタンを押すと、プログラムがクラッシュします。行にコメントすると

m(0,0) = 5;

アウト、すべてが機能します。

編集 2: データ ストレージに問題がある可能性があるため、コピー コンストラクターとマトリックス クラスのプライベート変数を次に示します。

private:
std::vector <T> data;
size_t rows, columns;

//Copy constructor
template<typename T>
matrix<T>::matrix(const matrix<T>& other)
    : rows(other.rows), columns(other.columns) {
    data = other.data;
}
4

2 に答える 2

1

わかった...

connect(transposeButton, &QPushButton::clicked, [model]() {
    beginResetModel();
    m(0,0)=50;
    endResetModel();
});

動作...モデルは既にポインターであるため、ラムダ関数に同じポインターを与えます。これはまだ機能していないため、転置機能の何が正しくないのかを理解する必要がありますが、クラッシュはなくなりました:Pご提案ありがとうございます:)

于 2016-05-14T23:56:37.327 に答える