C++ 将对象传递给QT中的函数会导致分段错误
提前感谢您抽出时间。我对编码世界还是新手,所以如果我问一些愚蠢或明显的问题,请原谅 我正在用QT编写一个小程序来处理数据库的数据。为了表示数据,我使用qtableview。我有几个配置相同,所以我做了一个函数来配置它们:C++ 将对象传递给QT中的函数会导致分段错误,c++,qt,C++,Qt,提前感谢您抽出时间。我对编码世界还是新手,所以如果我问一些愚蠢或明显的问题,请原谅 我正在用QT编写一个小程序来处理数据库的数据。为了表示数据,我使用qtableview。我有几个配置相同,所以我做了一个函数来配置它们: QT 5.12 void MainWindow::configureTableView(QSqlTableModel *model, QTableView *table, QString DBTable) { //Pacients table. model =
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");
程序启动并显示OK,但只要我尝试对视图执行任何操作(如设置过滤器)
PatientsTable->setFilter(Search)
当Search是由其他函数根据用户输入配置的QString时,程序崩溃,QT告诉我它收到了来自操作系统的信号:SIGSEGV segmentation fault
现在,当is对所有这些进行编码时,我有:
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");
这是一个非常常见的初学者误解。传递指针以修改所指向的内容。无法修改指针本身。在这方面,指针与任何其他类型的变量一样。您需要在configureTableView-configureTableViewQSqlTableModel*&model。。。现在,在调用configureTableView指针之后,PatientsTable仍然未初始化。阅读如何更新指针传递到函数的值。任何函数,无论是Qt还是任何C++应用程序,如果参数是指针,函数要么需要现有项的地址,要么传递一个null pTR。这是调用函数可以使用它做的唯一事情——要么使用现有实体,要么检查nullptr,其他什么都不做。在这种情况下,传递未初始化的指针毫无意义。如果函数引用指针,则情况就不同了。