初めての投稿になりますが、プログラミングを始めてから、たくさんの方々にお世話になりました。
私は Qt を初めて使用し、現時点で最初のプロジェクトを作成しようとしています。私の質問は、モデル、基になるデータ、およびビューの間の通信についてです。
私は最初にバックグラウンドのもの (データの保存など) を GUI から分離しました。今、私はテンプレート クラスを持っており、から継承Matrix
するテンプレート クラスを作成しました。これは正常に機能しています。つまり、テーブルを編集でき、ビューとモデルのデータで値が更新されます。MatrixModel
QAbstractTableModel
ここで私の質問: 新しいメソッドを作成せずにモデル内のデータを変更するにはどうすればよいですか?
メインウィンドウ.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;
}