Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在QTreeWidget中调用上下文菜单_Python_Qt_Pyqt_Qtreewidget - Fatal编程技术网

Python 在QTreeWidget中调用上下文菜单

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

我想在用户单击QTreeWidgetItem中的对象时弹出一个菜单。我想从QWidget中捕获信号contextMenuRequested,然后使用itemAt从视图中检索索引。但这看起来不太漂亮。有没有更简单的方法可以调用视图中某个项目的菜单?

我使用的方法如下:

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?为什么需要?