Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将对象传递给QT中的函数会导致分段错误_C++_Qt - Fatal编程技术网

C++ 将对象传递给QT中的函数会导致分段错误

C++ 将对象传递给QT中的函数会导致分段错误,c++,qt,C++,Qt,提前感谢您抽出时间。我对编码世界还是新手,所以如果我问一些愚蠢或明显的问题,请原谅 我正在用QT编写一个小程序来处理数据库的数据。为了表示数据,我使用qtableview。我有几个配置相同,所以我做了一个函数来配置它们: QT 5.12 void MainWindow::configureTableView(QSqlTableModel *model, QTableView *table, QString DBTable) { //Pacients table. model =

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

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

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,其他什么都不做。在这种情况下,传递未初始化的指针毫无意义。如果函数引用指针,则情况就不同了。