[英]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.