2016-04-30 8 views
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) 

をしています何か問題でも?これは、マウスクリックイベントのモデルの変更を達成する良い方法ですか?

+1

あなたのクロージャ '[&]'に問題がある可能性があります。これを '[tableView]'に置き換えてください。 – Evgeny

+0

パーフェクト!本当にありがとう! @evgeny私はそれを受け入れることができるように答えとして投稿:) – Krzysiek

答えて

0

閉鎖の問題[&]。これを[tableView]に置き換えてください。

関連する問題