首页 > 解决方案 > 将对象传递给 QT 中的函数会导致分段错误

问题描述

在此先感谢您的时间。我还是编码世界的新手,所以如果我问一些愚蠢或明显的问题,请原谅。

我正在用 QT 编写一个小程序来处理数据库的数据。为了表示我使用 QTableViews 的数据。我有几个配置相同,所以我做了一个功能来配置它们:

QT 5.12
void MainWindow::configureTableView(QSqlTableModel *model, QTableView *table, QString DBTable)
{
    //Pacients table.
    model = new QSqlTableModel(this);
    model->setTable(DBTable);
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    table->setModel(model);
    table->setSortingEnabled(true);
    table->setCornerButtonEnabled(true);
    table->hideColumn(0);
}

我在 mainwindow.h 中定义了一些 QSqlTableModel:

 QSqlTableModel *PatientsTable;
...

我用以下方法调用该函数:

configureTableView(PatientsTable, ui->ClientsTabTableView, "Pacientes");

程序启动并显示正常,但是一旦我尝试对视图执行任何操作,例如设置过滤器

PatientsTable->setFilter(Search)

其中 Search 是由其他函数根据用户输入配置的 QString,程序崩溃并且 QT 告诉我它收到了来自操作系统的信号:SIGSEGV(分段错误)。

现在什么时候编码所有这些,在某些时候我有:

void MainWindow::configureTableView(QTableView *table, QString DBTable)

    PatientsTable = new QSqlTableModel(this);
    PatientsTable->setTable(DBTable);
    PatientsTable->setEditStrategy(QSqlTableModel::OnManualSubmit);
    PatientsTable->select();
    table->setModel(PatientsTable);
    table->setSortingEnabled(true);
    table->setCornerButtonEnabled(true);
    table->hideColumn(0);

完全没有问题的工作。

我错过了什么?我已经挖掘了一段时间,我在互联网上找到的代码和解释不起作用。感谢你的宝贵时间!

标签: c++qt

解决方案


问题是您的函数不会修改PatientsTable变量。仅将指针传递给函数不会让您修改指针本身(仅它指向的内容)。简单的解决方案,通过引用传递指针。

void MainWindow::configureTableView(QSqlTableModel *&model, QTableView *table, QString DBTable)

另一种选择(在我看来更好)是从函数返回指针

QSqlTableModel *MainWindow::configureTableView(QTableView *table, QString DBTable)
{
    QSqlTableModel *model = new QSqlTableModel(this);
    ...
    return model;
}


PatientsTable = configureTableView(ui->ClientsTabTableView, "Pacientes");

这是一个非常常见的初学者误解。传递指针以修改所指向的内容。指针本身不能修改。在这方面,指针就像任何其他类型的变量一样。


推荐阅读