0
私はQtを学習しています。私は現在、Minesweeper同様のゲームを開発中です。Qt TableViewモデルsetData()がアプリケーションをクラッシュさせます
ゲームボードを表示するために、QAbstractTableModel
を拡張する私のカスタムモデルでQTableViewを使用しています。
モデルからのデータの表示はうまく機能します。 QVariant data(const QModelIndex &index, int role)
がオーバーロードされ、すべてのセルが適切に「コンテンツ」を表示しています。
ここで、ゲームボードのクリックを処理し、データをモデルに渡したいと思います。
私はのsetData()関数をオーバーロードしています
bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) {
qDebug("setData invoked");
return false;
}
とテーブルビューをクリック取り扱わ:
MainWindow::MainWindow(QWidget *parent) : QWidget(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTableView *tableView = this->findChild<QTableView*>("tableView");
tableView->setModel(new MyModel(tableView, DEFAULT_ROWS_NUM, DEFAULT_COLS_NUM));
QObject::connect(tableView, &QAbstractItemView::clicked, [&](const QModelIndex &index) {
qDebug(qUtf8Printable(QString("click: %1 %2").arg(index.row()).arg(index.column())));
tableView->model()->setData(index, 'W'); // this line crashes application
});
}
が、クラッシュするアプリケーションをtableView->model()->setData()
原因:私は
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000008
Exception Note: EXC_CORPSE_NOTIFY
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 org.qt-project.QtWidgets 0x0000000104bc9c67 QAbstractItemView::model() const + 7
1 studia.Minesweeper 0x0000000104939501 MainWindow::MainWindow(QWidget*)::$_0::operator()(QModelIndex const&) const + 385 (mainwindow.cpp:13)
をしています何か問題でも?これは、マウスクリックイベントのモデルの変更を達成する良い方法ですか?
あなたのクロージャ '[&]'に問題がある可能性があります。これを '[tableView]'に置き換えてください。 – Evgeny
パーフェクト!本当にありがとう! @evgeny私はそれを受け入れることができるように答えとして投稿:) – Krzysiek