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?
Das Problem vielleicht mit Ihrer Schließung '[&]'. Ersetzen Sie dies durch '[tableView]'. – Evgeny
Perfekt! Vielen Dank! @evgeny poste es als Antwort, damit ich es akzeptieren kann :) – Krzysiek