QT C++ 解决调试运行时报 The inferior stopped 错误

(1)报错信息和报错时调用堆栈

SignaI Received - Qt Creator

The inferior stopped because it received a signal from the operating system.
Signal name: SIGSEGV
Signal meaning:Segmentation fault报错时调用堆栈停留在 void MyTableView::setModel() 函数的该行:

报错时调用堆栈停留在 void MyTableView::setModel() 函数的该行:
    // 设置共享选择模型
    tableView->setSelectionModel(sharedSelectionModel);

// 函数代码
void MyTableView::setModel(QStandardItemModel *model) {
    tableView_model = model;
    tableView->setModel(model);
    listView_model = tableView_model;

    listView->setModel(listView_model);
    iconView->setModel(listView_model);

    // 创建共享选择模型。创建时需要使用 model变量,所以必须放在这里
    if (!sharedSelectionModel) {  // 避免重复创建
        sharedSelectionModel = new QItemSelectionModel(model, this);
    }

    // 设置共享选择模型
    tableView->setSelectionModel(sharedSelectionModel);
    tableView->resizeColumnsToContents();  // 自动调整列宽
    listView->setSelectionModel(sharedSelectionModel);
    iconView->setSelectionModel(sharedSelectionModel);
}

 

  

(2)报错原因分析

      原因是sharedSelectionModel变量非法,因为下面的判断导致sharedSelectionModel变量没有被正常创建。
      因为sharedSelectionModel在 mytableview.h 定义为:
      QItemSelectionModel *sharedSelectionModel;
      在 MyTableView 构造函数中也未初始化。默认情况下,sharedSelectionModel 的值为随机数,if (!sharedSelectionModel) 判断时 sharedSelectionModel 为随机数并不为空,所以导致误判断 sharedSelectionModel 已经创建,导致sharedSelectionModel变量没有被正常创建。所以,下面的调用报 The inferior stopped 错误

// 创建共享选择模型。创建时需要使用 model变量,所以必须放在这里
if (!sharedSelectionModel) { // 避免重复创建
      sharedSelectionModel = new QItemSelectionModel(model, this);
}

(3)解决办法。
      清楚了报错原因,解决办法就很简单。在 MyTableView 构造函数中初始化 sharedSelectionModel 为 nullptr 即可解决。

MyTableView::MyTableView(QWidget *parent)
    : QWidget(parent),
      ...
      lastMouseEvent(nullptr),
      ...

 

  

 

posted on 2024-12-02 16:48  patton88  阅读(205)  评论(0编辑  收藏  举报

导航