c++ - 如何使用 QTreeView 在 QComboBox 中选择项目
问题描述
我试图在下面的代码中使用 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"));
解决方案
如果有孩子的节点永远不会与没有孩子的节点有相同的文本,那么下面的方法是合适的。
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());
在这两种情况下,我都假设没有子节点的节点总是有不同的文本。如果没有子节点的节点与名称匹配,则选择其中之一。
推荐阅读
- android - photoshop text 和 android textview 有什么区别?
- python - 如何为我的加密函数进行反向函数解密
- python - 为什么按键后图像不会改变?
- azure - 如何在 azure 中使用 Desired state configuration (DSC) 在 VM 中安装 Google chrome?
- python - 当我尝试使用跟踪器 URL 建立连接请求时,socket.recv() 超时
- android - 如何从 https 网站获取 http 内容?
- pandas - 如何在 pandas.io.parsers.TextFileReader 中添加/编辑文本
- excel - 我想消除精确范围(G1)并使此文本到列代码动态以将列值转换为日期
- jquery - 错误图像调整大小从 javascript 更改类
- react-native - 反应原生地图标记在状态更新时闪烁