2016-04-30 6 views
0

Ich lerne Qt und ich entwickle Minesweeper gleich Spiel jetzt.Qt TableView-Modell setData() stürzt Anwendung

Für die Anzeige von Spielbrett verwende ich QTableView mit meinem benutzerdefinierten Modell, das QAbstractTableModel erweitert.

Die Anzeige von Daten aus dem Modell funktioniert gut. Ich habe QVariant data(const QModelIndex &index, int role) überladen und alle Zellen zeigen ihren "Inhalt" richtig an.

Jetzt würde ich gerne Spielbrettklicks behandeln und irgendwelche Daten an das Modell übergeben.

Ich habe setData() Funktion überlastet:

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

und behandelt Tableview klickt:

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 
    }); 
} 

aber tableView->model()->setData() verursacht Anwendung Absturz:

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) 

Bin ich tun etwas stimmt nicht? Ist dies eine gute Möglichkeit, Änderungen am Modell bei Mausklickereignissen zu erreichen?

+1

Das Problem vielleicht mit Ihrer Schließung '[&]'. Ersetzen Sie dies durch '[tableView]'. – Evgeny

+0

Perfekt! Vielen Dank! @evgeny poste es als Antwort, damit ich es akzeptieren kann :) – Krzysiek

Antwort

0

Das Problem mit Ihrem Verschluss [&]. Ersetzen Sie dies durch [tableView].