【问题标题】:How to select item in QComboBox with QTreeView如何使用 QTreeView 在 QComboBox 中选择项目
【发布时间】:2018-07-08 10:38:47
【问题描述】:

我试图在下面的代码中使用 QTreeView 从 QComboBox 中选择项目“leaf2”。

我只想通过代码从文本中选择没有子项的项目。 (如果有孩子,就不能选择了)

如何选择没有子项的项或索引?

谁能帮我解决这个问题?

谢谢。

void Main::initView()
{
    QStandardItemModel *model = new QStandardItemModel;
    QStandardItem *root_item = model->invisibleRootItem();

    // Build Model Items
    QStandardItem *node_item = NULL;
    node_item = new QStandardItem("Node");
    node_item->setFlags(Qt::ItemIsEnabled);
    root_item->appendRow(node_item);

    QStandardItem *leaf_item = new QStandardItem("leaf1");
    leaf_item ->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    node_item->appendRow(leaf_item );

    leaf_item = new QStandardItem("leaf2");
    leaf_item ->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
    node_item->appendRow(leaf_item );

    // Set Model to TreeViewComboBox
    ui.cb_treevew->setModel(model);

    ui.cb_treeview->setCurrentIndex(0); // "Node" is selected.
    ui.cb_treeview->setCurrentIndex(1); // Nothing is selected.
    ui.cb_treeview->setCurrentIndex(2); // Nothing is selected.
    ui.cb_treeview->setCurrentIndex(3); // Nothing is selected.
}

这是我的 CTreeViewComboBox 代码。

CTreeViewComboBox::CTreeViewComboBox(QWidget *parent) : QComboBox(parent)
{
    QTreeView* treeView = new QTreeView(this);
    treeView->setEditTriggers(QTreeView::NoEditTriggers);
    treeView->setSelectionBehavior(QTreeView::SelectRows);
    treeView->setSelectionMode(QTreeView::SingleSelection);
    treeView->setItemsExpandable(true);
    treeView->header()->setVisible(false);
    treeView->setWordWrap(true);
    setView(treeView);
}

PS:我尝试选择以下项目,但无法正常工作。 :(

ui.cb_treeview->treeView()->setCurrentIndex(getModelIndexFromText("leaf2"));

【问题讨论】:

  • 输入是什么?在对没有子节点的节点进行编号的树中,有很多可能性。你说一个节点是 1,另一个是 2 等等的标准是什么?
  • 我只是想以任何方式通过代码选择TreeViewComboBox的项目。
  • 有子节点的节点可以和没有子节点的节点同名吗?
  • 不,他们不能。
  • 看我的回答..

标签: c++ qt qtreeview qcombobox qstandarditemmodel


【解决方案1】:

如果有孩子的节点永远不会与没有孩子的节点有相同的文本,那么下面的方法是合适的。

QModelIndexList modelIndexes = model->match(
            model->index(0, 0),
            Qt::DisplayRole,
            "leaf2",
            -1,
            Qt::MatchRecursive);
QModelIndex index = modelIndexes.first();
ui.cb_treeview.setRootModelIndex(index.parent());
ui.cb_treeview.setCurrentIndex(index.row());

另一方面,如果有孩子的节点可以和没有孩子的节点有相同的文本,你应该使用下面的方法。

QModelIndexList modelIndexes = model->match(
            model->index(0, 0),
            Qt::DisplayRole,
            "leaf2",
            -1,
            Qt::MatchRecursive);

QModelIndexList::iterator tstIt = std::find_if(modelIndexes.begin(),
                                         modelIndexes.end(),
                                         [] (const QModelIndex & index) {
    return !index.model()->hasChildren(index);
});

ui.cb_treeview.setRootModelIndex(tstIt->parent());
ui.cb_treeview.setCurrentIndex(tstIt->row());

在这两种情况下,我都假设没有子节点的节点总是有不同的文本。如果没有子节点的节点与名称匹配,请选择其中之一。

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多