QTreeView с 2 столбцами для каждой записи

Я хочу создать QTreeview с 2 столбцами. Это не проблема до сих пор. Я сделал это с помощью следующего кода:

QStandardItemModel *model = new QStandardItemModel(0,2);
ui->treeView->setModel(model);

Теперь я хочу заполнить это TreeView. Для этого я создал QStandardItem с 0 строками и 1 столбцом.

QStandardItem *root = new QStandardItem(0,2);

После этого я добавил данные в этот корневой элемент.

root->setText("name");
root->setData("value", 1);

В конце я добавляю модель в QTreeView

ui->treeView->setModel(model);

Проблема в том, что это значение не отображается во втором столбце QTreeView. Я уверен, что причина в том, что второй столбец модели не совпадает со вторым столбцом корневого элемента.

Но как решить эту проблему?

0

Решение

Вам не нужно указывать количество строк или столбцов, просто сконцентрируйтесь на добавлении элементов в вашу модель, и она позаботится о внутренних деталях.

В этом минимальном примере создается модель, заполненная тремя родителями (внешний цикл) с 3, 2 и 1 дочерним элементом каждый (внутренний цикл). Таким образом, модель будет иметь в общей сложности (1 + 3) + (1 + 2) + (1 + 1) = 9 строк и два столбца на строку для дочерних элементов (имя и данные), но только один для родители (только имя, обратите внимание на 0 добавлено как второе значение).

QStandardItemModel * model = new QStandardItemModel;

QStandardItem * root = model->invisibleRootItem();

QList<QStandardItem*> rowItems;
for (int i = 0; i < 3; ++i) {
QString parentName = QString("Parent #%1").arg(i + 1);
QStandardItem* parent = new QStandardItem(parentName);
rowItems << parent << 0;
root->appendRow(rowItems);
rowItems.clear();

for (int j = 0; j < 3 - i; ++j) {
QString childName = QString("Child %1-%2").arg(i + 1).arg(j + 1);
QStandardItem* item = new QStandardItem(childName);
int content = (i + 1) * (j + 1) * 2700;
QStandardItem* itemData = new QStandardItem(QString("%1").arg(content));
rowItems << item << itemData;
parent->appendRow(rowItems);
rowItems.clear();
}
}

model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Data"));

ui->treeView->setModel(model);

Обратите внимание, что в этом примере используются следующие шаги:

  1. Создать модель
  2. Заполните модель строка за строкой. Каждая строка представляет собой список QStandardItem элементы (rowItems), и вы добавляете строку к ее родительскому элементу (или к корневому элементу, если они являются элементами первого уровня).
  3. Установите дополнительные характеристики модели (в данном случае заголовки)
  4. Прикрепите модель к любому представлению, которое необходимо.

Обратите внимание, что я не использовал model->beginInsertRows(...) а также model->endInsertRows() поскольку модификации модели выполняются до прикрепления модели к видам. Если вы измените содержание модели после прикрепляя его к любому представлению, вы должны использовать эти вызовы. В противном случае имейте в виду, что любой индекс, который вы можете использовать, может стать недействительным после обновления модели.

1

Другие решения

Я нашел решение для моей проблемы. Теперь я добавляю второй элемент в модель, который отображает значение.

Это означает, что сначала вы должны создать модель с таким количеством столбцов, которое вам нужно.

QStandardItemModel *model = new QStandardItemModel(0,2);

На втором шаге вы должны создать элемент для каждой ячейки строки.

QStandardItem *itemColumn1 = new QStandardItem();
itemColumn1->setText("name");

QStandardItem *itemColumn2 = new QStandardItem();
itemColumn2->setText("value");

После этого вы должны создать список с ними.

QList<QStandardItem*> list = QList<QStandardItem*>();
list.append(itemColumn1);
list.append(itemColumn2);

Теперь вы можете добавить этот список к родительскому элементу.

QStandardItem *root = new QStandardItem();
root->appendRow(list);

После этого вы добавляете корневой элемент в модель.

model->appendRow(root);

Наконец вы добавляете модель в TreeView

ui->treeView->setModel(model);

Теперь вы готовы. Я думаю, что это не лучшее решение. Если вы знаете лучший вариант, пожалуйста, сообщите нам.

1

По вопросам рекламы [email protected]