c++ - Qt TableView 模型 setData() 使应用程序崩溃

标签 c++ qt qtableview qabstracttablemodel

我正在学习 Qt,现在正在开发类似扫雷的游戏。

为了显示游戏板,我将 QTableView 与我的自定义模型一起使用,该模型扩展了 QAbstractTableModel

显示来自模型的数据效果很好。我已经重载了 QVariant data(const QModelIndex &index, int role),所有单元格都正确显示了它们的“内容”。

现在我想处理游戏板点击并将任何数据传递给模型。

我重载了 setData() 函数:

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)

我做错了什么吗?这是实现鼠标点击事件模型变化的好方法吗?

最佳答案

闭包 [&] 的问题。将其替换为 [tableView]

关于c++ - Qt TableView 模型 setData() 使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958046/

相关文章:

c++ - 如何在栈和堆对象之间转换

c++ - Log4Cplus加载配置文件

Qt Widget 暂时全屏

c++ - 如何使用 QPainter 在 QMainWindow 中的一组小部件中的特定小部件上绘制?

qt - 如何恢复Qt Creator Designer widget box?

qt - 如何使用自定义(不可编辑)委托(delegate)创建模型/ View TableView?

python - Qt 模型/ View 表中的按钮

<cmath> SQRT() 的 c++ 实用计算复杂度

c++ - 从 Visual C++ 6.0 到 Visual Studio 2012 的转换问题

qt4 - 如何更改水平标题的高度(QTableWidget)