Python 在QTreeWidget中调用上下文菜单
我想在用户单击QTreeWidgetItem中的对象时弹出一个菜单。我想从QWidget中捕获信号contextMenuRequested,然后使用itemAt从视图中检索索引。但这看起来不太漂亮。有没有更简单的方法可以调用视图中某个项目的菜单?我使用的方法如下:Python 在QTreeWidget中调用上下文菜单,python,qt,pyqt,qtreewidget,Python,Qt,Pyqt,Qtreewidget,我想在用户单击QTreeWidgetItem中的对象时弹出一个菜单。我想从QWidget中捕获信号contextMenuRequested,然后使用itemAt从视图中检索索引。但这看起来不太漂亮。有没有更简单的方法可以调用视图中某个项目的菜单?我使用的方法如下: self.widget_layers.setContextMenuPolicy(Qt.ActionsContextMenu) removeLayerAction = QAction("Remove selected layer", s
self.widget_layers.setContextMenuPolicy(Qt.ActionsContextMenu)
removeLayerAction = QAction("Remove selected layer", self)
self.connect(removeLayerAction, SIGNAL('triggered()'), self.layers_widget_controller.remove_selected_layer)
class ItemDelegate: public QItemDelegate
{
public:
ItemDelegate(ContextMenuHandler *const contextMenu, QObject *const parent )
: QItemDelegate(parent)
, m_contexMenu(contextMenu)
{
}
bool editorEvent(
QEvent * event,
QAbstractItemModel * model,
const QStyleOptionViewItem & option,
const QModelIndex & index )
{
if((event->type()==QEvent::MouseButtonPress) && index.isValid())
{
QMouseEvent *const mouseEvent = qobject_cast<QMouseEvent>(event);
if(mouseEvent && (mouseEvent->button()==Qt::RightButton))
{
return m_contexMenu->showContextMenu(mouseEvent->pos(), index);
}
}
}
ContextMenuHandler *const m_contextMenu;
};
treeWidget->setItemDelegate(new ItemDelegate(contextMenuHandler,treeWidget));
并检查以下哪项触发了信号:
selected_item = self.main_window.widget_layers.selectedItems()[0]
编写您自己的自定义ItemDelegate并在
QAbstractItemDelegate::editorEvent
中处理单击事件。
您可以从QModelIndex检索单元格中的数据。
在C++中,它看起来是这样的:
self.widget_layers.setContextMenuPolicy(Qt.ActionsContextMenu)
removeLayerAction = QAction("Remove selected layer", self)
self.connect(removeLayerAction, SIGNAL('triggered()'), self.layers_widget_controller.remove_selected_layer)
class ItemDelegate: public QItemDelegate
{
public:
ItemDelegate(ContextMenuHandler *const contextMenu, QObject *const parent )
: QItemDelegate(parent)
, m_contexMenu(contextMenu)
{
}
bool editorEvent(
QEvent * event,
QAbstractItemModel * model,
const QStyleOptionViewItem & option,
const QModelIndex & index )
{
if((event->type()==QEvent::MouseButtonPress) && index.isValid())
{
QMouseEvent *const mouseEvent = qobject_cast<QMouseEvent>(event);
if(mouseEvent && (mouseEvent->button()==Qt::RightButton))
{
return m_contexMenu->showContextMenu(mouseEvent->pos(), index);
}
}
}
ContextMenuHandler *const m_contextMenu;
};
treeWidget->setItemDelegate(new ItemDelegate(contextMenuHandler,treeWidget));
class ItemDelegate:公共QItemDelegate
{
公众:
ItemDelegate(ContextMenuHandler*常量contextMenu,QObject*常量父项)
:QItemDelegate(父级)
,m_上下文菜单(上下文菜单)
{
}
bool editorEvent(
QEvent*事件,
QAbstrateModel*模型,
常量QSTYLEOPTION视图项和选项,
常数QModelIndex和索引)
{
if((event->type()==QEvent::MouseButtonPress)&&index.isValid())
{
QMouseEvent*const mouseEvent=qobject_cast(事件);
if(mouseEvent&&(mouseEvent->button()==Qt::RightButton))
{
返回m_contextmenu->showContextMenu(mouseEvent->pos(),index);
}
}
}
ContextMenuHandler*常量m_contextMenu;
};
treeWidget->setItemDelegate(新的ItemDelegate(contextMenuHandler,treeWidget));
我对新的信号/插槽样式做了什么:
self.treeMenu = QMenu()
self.treeAction = QAction('print', self.treeMenu)
self.treeAction.triggered.connect(self.printTreeItem)
self.treeWidget.addAction(self.treeAction)
@pyqtSlot()
def printTreeItem(self):
print self.treeWidget.currentItem().text(0)
当您在树状图中单击鼠标右键时,将打开一个菜单。如果你点击“打印”,它会在你的控制台中打印出当前焦点所在的项目,这就是你右键点击的项目
注意:当前项目不是所选项目所必需的,所选项目是您最近单击的项目。谢谢,这看起来相当漂亮:-)事件直接在项目中处理。什么是ContextMenuHandler?为什么需要?