我有一个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
我做错了什么?我怎样才能得到我右键点击的项目?
答案 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是否为空,你应该好好去