获取QTtandardItem以获取QTreeView的自定义上下文菜单

时间:2014-09-26 05:44:59

标签: qt qt5 qtreeview qstandarditemmodel qt5.3

我有一个QTreeView的子类。我需要一个特定项目的自定义上下文菜单。为此,我设置了上下文菜单策略并连接信号" customContextMenuRequested"在QTreeView的子类的构造函数中:

setContextMenuPolicy( Qt::CustomContextMenu );

QObject::connect( this, SIGNAL( customContextMenuRequested( const QPoint & ) ), this, SLOT( onCustomContextMenu( const QPoint & ) ) );

现在,在插槽功能" onCustomContextMenu"我将上下文菜单创建的位置作为QPoint。我想得到这个位置上显示的QStandardItem。我试过这个:

void t_my_tree_view::onCustomContextMenu( const QPoint &point )
{
  QModelIndex index = this->indexAt( point );
  QStandardItem* item_ptr = m_item_model->item( index.row, index.column() );
}

m_item_model是一个指向QStandardItemModel的指针,它是QTreeview的这个子类中的模型。

问题是," item_ptr"我得到的有时是错误的,或者它是NULL。如果我的模型如下所示,它将为NULL:

invisibleRootItem
| -item_on_level_1
  | -item_on_level_2
  | -item_on_level_2
  | -item_on_level_2< - 这是右键单击的项目   | -item_on_level_2

我做错了什么?我怎样才能得到我右键点击的项目?

2 个答案:

答案 0 :(得分:1)

您应该将QPoint坐标映射到view->viewport()坐标。

令人难以置信的方法是实施自定义QStyledItemDelegate并重写editorEvent,例如:

bool LogDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, QStyleOptionViewItem const& option, QModelIndex const& index)
{
    switch (event->type())
    {
    case QEvent::MouseButtonRelease:
        {
            QMouseEvent* me = static_cast<QMouseEvent *>(event);
            if (me->button() == Qt::RightButton)
            {
                QMenu menu;
                QAction* copy = new QAction("Copy", this);
                connect(copy, SIGNAL( triggered() ), SIGNAL(copyRequest()));
                menu.addAction(copy);
                menu.exec(QCursor::pos());
                copy->deleteLater();
            }
        }
        break;

    default:
        break;
    }

    return QStyledItemDelegate::editorEvent(event, model, option, index);
}

答案 1 :(得分:1)

如果您的contextMenuRequest选择了TreeItem,那么您可以使用QTreeView::currentIndex()来获取实际选定的QModelIndex

使用QStandardItemModel::itemFromIndex(const QModelIndex&)获取指向QStandardItem

的指针

以防万一,检查ptr是否为空,你应该好好去