วิธีเลือกรายการใน QComboBox ด้วย QTreeView

ฉันพยายามเลือกรายการ "leaf2" จาก QComboBox ด้วย QTreeView ในโค้ดด้านล่าง

ฉันแค่ต้องการเลือกรายการที่ไม่มีลูกจากข้อความตามรหัส (ถ้ามีลูกจะไม่สามารถเลือกได้)

ฉันจะเลือกรายการหรือดัชนีที่ไม่มีรายการย่อยได้อย่างไร

ใครสามารถช่วยฉันด้วยปัญหานี้?

ขอบคุณ

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"));

person ChangYun Du    schedule 08.07.2018    source แหล่งที่มา
comment
อินพุตจะเป็นอย่างไร? ในแผนผังเพื่อระบุหมายเลขโหนดที่ไม่มีลูก มีความเป็นไปได้มากมาย เกณฑ์ของคุณที่จะบอกว่าโหนดคือ 1 อีกอันคือ 2 ฯลฯ คืออะไร   -  person eyllanesc    schedule 08.07.2018
comment
ฉันแค่ต้องการเลือกรายการของ TreeViewComboBox ด้วยรหัส แต่อย่างใด   -  person ChangYun Du    schedule 08.07.2018
comment
โหนดที่มีลูกสามารถมีชื่อเดียวกันกับโหนดที่ไม่มีลูกได้หรือไม่?   -  person eyllanesc    schedule 08.07.2018
comment
ไม่ พวกเขาทำไม่ได้   -  person ChangYun Du    schedule 08.07.2018
comment
ดูคำตอบของฉัน..   -  person eyllanesc    schedule 08.07.2018


คำตอบ (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());

ในทั้งสองกรณี ฉันถือว่าโหนดที่ไม่มีลูกมักจะมีข้อความที่แตกต่างกัน หากโหนดที่ไม่มีลูกตรงกับชื่อ ให้เลือกโหนดใดโหนดหนึ่ง

person eyllanesc    schedule 08.07.2018