c++ - 将对象传递给 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);
完全没有问题的工作。
我错过了什么?我已经挖掘了一段时间,我在互联网上找到的代码和解释不起作用。感谢你的宝贵时间!
解决方案
问题是您的函数不会修改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");
这是一个非常常见的初学者误解。传递指针以修改所指向的内容。指针本身不能修改。在这方面,指针就像任何其他类型的变量一样。
推荐阅读
- r - Create multiple columns in data.table with `:=` without colnames
- javascript - 即使调用了 React 组件方法,expect(...).toHaveBeenCalled() 也会失败
- maple - 如何画出曲线
- python - Asynchronously chaining grpc calls
- angular - Observable subscribe not fired
- spinnaker - How add Bitbucket artifact in Spinnaker?
- e2e-testing - 在测试无服务器应用程序时,是否可以发出 API 请求以在 Cypress 中设置测试?
- android - 如何解决嵌套计数器?
- solidity - 已部署合约的函数仅返回 0
- sql - SQL 查询以识别跨多个子集的另一个表中未包含的行