[英]Qt: set columns in treeView
如何為qTreeView的qTreeWidget實現此代碼?
for (const auto & i : names) {
QTreeWidgetItem * item = new QTreeWidgetItem(ui->treeWidget);
item->setText(0, QString::fromStdString(i));
ui->treeWidget->addTopLevelItem(item);
const std::unordered_map<std::string, double> map = m_reader.getMapFromEntry(i);
for (const auto & j : map) {
QTreeWidgetItem * item2 = new QTreeWidgetItem();
item2->setText(0,QString::fromStdString(j.first));
item2->setText(1,QString::number(j.second));
item->addChild(item2);
}
}
我有一個模型和一個treeView,如下所示:
m_model = new QStandardItemModel(m_reader.getAllNames().size(),2,this);
ui->treeView->setModel(m_model);
我試過了,但是只顯示一列:
QStandardItem * parentItem = m_model->invisibleRootItem();
for (const auto & i : names) {
QStandardItem * item = new QStandardItem(QString::fromStdString(i));
parentItem->appendRow(item);
const std::unordered_map<std::string, double> map = m_reader.getMapFromEntry(i);
for (const auto & j : map) {
QList<QStandardItem *> rowItems;
rowItems << new QStandardItem(QString::fromStdString(j.first));
rowItems << new QStandardItem(QString::number(j.second));
item->appendRow(rowItems);
}
}
有了treeWidget,我就這樣設置了columnCount,如下所示:
ui->treeWidget->setColumnCount(2);
但是treeView沒有這樣的方法。
因此,總結一下: 如何實現一個多列的TreeView?
編輯:
為了澄清,我想要這樣的事情:
| -A
| | -BC
| | -DE
其中A是父母,B,C,D,E是孩子,B,D在第0列,C,E在第1列。
希望這可以幫助!
要支持多列,模型必須包含多列的數據。 因此從某種意義上說,列是模型的屬性,而不是視圖的屬性。 然后,視圖可以決定隱藏或重新排列某些列(例如,QListView始終僅顯示第一列,而一個人可以隱藏或重新排列QTableView中的列)。
使用QStandardItemModel時,其文檔應提供一些有關如何創建多個列的提示。
例如,從文檔中查看以下示例:
QStandardItemModel model(4, 4);
for (int row = 0; row < 4; ++row) {
for (int column = 0; column < 4; ++column) {
QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
model.setItem(row, column, item);
}
}
它創建一個具有4個初始行和列的模型,然后通過setItem()將其填充項目。
或者,您可以將項目列表傳遞給QStandardItemModel :: appendRow() ,並為每列提供一個項目:
QList<QStandardItem*> items;
items.append(new QStandardItem(tr("One"));
items.append(new QStandardItem(tr("Two"));
model->appendRow(items);
這將添加一個新行,第一列為“ One”,第二列為“ Two”。有關處理多列的更多方法,請參見QStandardItemModel文檔。
注意 :QTreeView在層次結構的所有級別上期望的列數相同,因此,如果需要,應在行中填充未使用的列的空項目。
弗蘭克·奧斯特費爾德(Frank Osterfeld)的回答只是補充:
QTreeView顯示插入到頂級QStandardItems中的子表的所有列。 您只需通過將虛擬QStandardItems插入頂級表中來“強制”它以顯示其他列。 例:
QStandardItemModel *objectTreeModel = new QStandardItemModel(NULL);
QStandardItem *mainItem = new QStandardItem(tr("Main Item"));
QStandardItem *subItem1 = new QStandardItem(tr("Sub-Item 1"));
QStandardItem *subItem2 = new QStandardItem(tr("Sub-Item 2"));
mainItem->appendRow(QList<QStandardItem *>() << subItem1 << subItem2);
QStandardItem *dummyItem = new QStandardItem();
objectTreeModel->appendRow(QList<QStandardItem *>() << mainItem << dummyItem );
現在,您將能夠看到2列,並且如果展開mainItem,兩個子項目都將可見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.