Настройка QSqlTableModel для QTreeView
Я пытаюсь положить таблицу MySQL в treeView
,
Каждая запись имеет три значения в базе данных - id
, text
, parentId
, это treeView
должен быть редактируемым, поэтому мне очень нравится QSqlTableModel
подход, так как функциональность для сохранения обратно в базу данных уже встроена.
Теперь treeView
показывает все записи в одной строке, конечно, и мне нужна иерархия. Как лучше построить эту иерархию, сохранив при этом возможности редактирования и сохранения?
(Я использую MySQL.)
mainwindow.h
private: QSqlTableModel* goalModel;
mainwindow.cpp
(это создает иерархию плоских таблиц. Таблица фильтруется в зависимости от того, какая запись нажата в другой таблице)
void MainWindow::on_tableViewGoals_clicked(const QModelIndex &index)
{
goalModel = new QSqlTableModel(this);
goalModel->setTable("goals");
//Gets the id from the clicked entry to use as filter
QString idGoals = index.sibling(row,0).data().toString();
goalModel->setFilter( "id_goals=" + idGoals );
goalModel->setEditStrategy(QSqlTableModel::OnRowChange);
goalModel->select();
ui->treeView->setModel(goalModel);
...
Я попробовал это. Это неправильно, но я не знаю почему. (третий столбец содержит значение parentId, если оно есть в записи)
for (int row = 0; row < goalModel->rowCount(); ++row)
{
//if the entry has a value over 0 in the parentId column
if (goalModel->index(row,2).data().toInt() > 0)
{
//get number in column 2
int parentId;
parentId = goalModel->index(row,2).data().toInt();
QModelIndex newChild = goalModel->index(row,0);
//find QModelIndex row with matching number in column 0
for (int row = 0; row < goalModel->rowCount(); ++row)
{
if (goalModel->index(row,0).data().toInt() == parentId )
{
//make this entry that entry's child
QModelIndex newParent = goalModel->index(row,0);
newChild = goalModel->index(0,0,newParent);
}
}
}
}
Все индексы уже созданы, поэтому не нужно создавать новые, просто назначьте родителя всем, у кого он есть. Как лучше это сделать?