如果QTreeView项没有子项,则禁用QAction

时间:2018-11-25 12:02:52

标签: c++ qt qt5 qtreeview

我从数据库中填充了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; 中选择的项目是否不是任何项目的父项,并且是否具有父项。

我应该在此处包含QTreeViewQTreeView代码以查看还是无关紧要?

1 个答案:

答案 0 :(得分:1)

Qt文档。有一个专用于该主题的章节:

Model/View Programming

我建议进行概述。

关于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要求的行为。可能有必要解决此问题,但这并不难。