python qt pyqt qtreewidget

python - Invocando el menú contextual en QTreeWidget



pyqt (3)

Estoy usando algo como esto:

self.widget_layers.setContextMenuPolicy(Qt.ActionsContextMenu) removeLayerAction = QAction("Remove selected layer", self) self.connect(removeLayerAction, SIGNAL(''triggered()''), self.layers_widget_controller.remove_selected_layer)

y verificar qué elemento activó la señal al:

selected_item = self.main_window.widget_layers.selectedItems()[0]

Me gustaría mostrar un menú emergente cuando el usuario hace clic en un objeto en QTreeWidgetItem. Pensé en capturar la señal contextMenuRequested de QWidget y luego recuperar el índice de la vista usando itemAt. Pero esto no parece muy bonito. ¿Hay alguna manera más fácil de poder llamar un menú en un elemento dentro de una vista?


Lo que hice con el nuevo estilo de señal / ranura:

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)

Esto abrirá un menú cuando haga clic derecho dentro de su treeWidget. Y si hace clic en ''imprimir'', en su consola se imprimirá el elemento que tiene el foco actual, es en el que hizo clic derecho.

Nota: el elemento actual no es necesario para el elemento seleccionado, el elemento seleccionado es el que ha hecho clic más recientemente.


Escriba su propio ItemDelegate personalizado y maneje el evento click en QAbstractItemDelegate::editorEvent . Puede recuperar los datos en la celda desde QModelIndex. En C ++ se vería así:

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));