簡體   English   中英

將對象傳遞給 QT 中的函數會導致分段錯誤

[英]Passing object to a function in QT causes Segmentation Fault

在此先感謝您的時間。 我還是編碼世界的新手,所以如果我問一些愚蠢或明顯的問題,請原諒。

我正在用 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");

這是一個非常常見的初學者誤解。 傳遞指針以修改所指向的內容。 指針本身不能修改。 在這方面,指針就像任何其他類型的變量一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM