我从数据库中填充了terser-webpack-plugin
。
我的上下文菜单配置为:
QTreeView
我可以找到右键单击以打开项目上的contextMenu的方法。
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
h.file
void MainWindow::on_treeView_customContextMenuRequested(const QPoint &pos)
{
QModelIndex idx = ui->treeView->indexAt(pos);
if (!idx.isValid())
{return;}
else{
QPoint globalPos = ui->treeView->mapToGlobal(pos);
QAction* selectedItem = contextMenu->exec(globalPos);
if (selectedItem){
qDebug () << selectedItem;
}
}
如何检查从QMenu *contextMenu;
中选择的项目是否不是任何项目的父项,并且是否具有父项。
我应该在此处包含QTreeView
和QTreeView
代码以查看还是无关紧要?
答案 0 :(得分:1)
Qt文档。有一个专用于该主题的章节:
我建议进行概述。
关于OP的实际问题:
如何检查从QTreeView中选择的项目是否不是任何项目的父项,并且是否具有父项。
QTreeView
继承了QAbstractItemView::model()
,该指针提供了指向QAbstractItemModel
的指针,而该指针又为呈现的树视图项提供了基础模型数据。
在视图中提供的QModelIndex
中的任何人都应引用此模型。
QAbstractItemModel
提供了多种方法来检索有关模型项的可视化和关系的数据。 QTreeView
使用此功能,但也应将其用于任何附加功能。
因此,所选项目不是任何项目的父项被转为“ {selected item no children”的所选项目没有子项”,QAbstractItemModel::hasChildren()
最适合:
可以使用bool QAbstractItemModel :: hasChildren(const QModelIndex&parent = QModelIndex())const
如果父母有孩子,则返回true;否则返回true。否则返回false。
使用父级上的rowCount()来找出子级数。
请注意,如果同一索引设置了标志Qt :: ItemNeverHasChildren,则使用此方法报告特定索引hasChildren是未定义的行为。
注意:可以通过元对象系统和QML调用此功能。请参阅Q_INVOKABLE。
另请参见 parent()和index()。
QAbstractItemModel::parent()
检索并且它具有父对象:
QModelIndex QAbstractItemModel :: parent(const QModelIndex&index)const
返回具有给定索引的模型项的父项。如果该项没有父项,则返回无效的QModelIndex。
在模型中使用的公开树数据结构的常规约定是,只有第一列中的项目才具有子级。在这种情况下,当在子类中重新实现此功能时,返回的QModelIndex的列将为0。
在子类中重新实现此函数时,请小心避免调用QModelIndex成员函数,例如QModelIndex :: parent(),因为属于您模型的索引会简单地调用您的实现,从而导致无限递归。
注意:可以通过元对象系统和QML调用此功能。请参阅Q_INVOKABLE。
另请参见 createIndex()。
将其组合在一起,OPs功能应如下所示:
void MainWindow::on_treeView_customContextMenuRequested(const QPoint &pos)
{
QModelIndex idx = ui->treeView->indexAt(pos);
if (!idx.isValid()
|| !ui->treeView->model()->hasChildren(idx)
&& !ui->treeView->model()->parent(idx).isValid()) {
return;
// bail out -> no context menu for leaf nodes or toplevel nodes
} else {
QPoint globalPos = ui->treeView->mapToGlobal(pos);
QAction* selectedItem = contextMenu->exec(globalPos);
if (selectedItem) {
qDebug () << selectedItem;
}
}
}
我不太确定这是否完全符合OP要求的行为。可能有必要解决此问题,但这并不难。