簡體   English   中英

Qt:在treeView中設置列

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

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