2016-04-30 9 views
0

Я изучаю Qt, и сейчас я разрабатываю игру Minesweeper.Qt TableView модель setData() аварийное приложение

Для отображения игрового поля я использую QTableView с моей пользовательской моделью, которая расширяет QAbstractTableModel.

Хорошо просматривается информация из модели. Я перегрузил QVariant data(const QModelIndex &index, int role), и все ячейки отображают их «контент» правильно.

Теперь я хотел бы обрабатывать клики игрового поля и передавать любые данные модели.

Я перегруженная функция УстановитьДанные():

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) { 
    qDebug("setData invoked"); 
    return false; 
} 

и обрабатываются TableView щелкает:

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].