On 17/12/10 09:40, Christopher Evans wrote:
Hi guys,

I have been using pyqt for years at many different jobs and many different
projects, however some things elude me. (I am a self-taught noob at heart)

I have written many tutorials for the community to help spread knowledge,
but this is one of the many things I myself have never found a good tutorial
on:

I just want to make a simple right click contextual menu on a
treewidgetitem.

Can anyone share a snippet showing this?

here's an example that handles context menu events invoked either by mouse or by keyboard. the keyboard event handler also scrolls the treewidgetitem into view if necessary.


from PyQt4.QtGui import (
    QApplication, QTreeWidget, QTreeWidgetItem, QMenu,
    )


class TreeWidget(QTreeWidget):
    def __init__(self, parent=None):
        QTreeWidget.__init__(self, parent)
        self.setWindowTitle('TreeWidget Context Menu')
        self.header().setHidden(True)
        self.setGeometry(320, 320, 320, 320)
        for index in '12345':
            parent = QTreeWidgetItem(self, ['Parent %s' % index])
            for item in 'ABCDE':
                QTreeWidgetItem(parent, ['Child %s%s' % (index, item)])
            parent.setExpanded(True)

    def contextMenuEvent(self, event):
        if event.reason() == event.Mouse:
            pos = event.globalPos()
            item = self.itemAt(event.pos())
        else:
            pos = None
            selection = self.selectedItems()
            if selection:
                item = selection[0]
            else:
                item = self.currentItem()
                if item is None:
                    item = self.invisibleRootItem().child(0)
            if item is not None:
                parent = item.parent()
                while parent is not None:
                    parent.setExpanded(True)
                    parent = parent.parent()
                itemrect = self.visualItemRect(item)
                portrect = self.viewport().rect()
                if not portrect.contains(itemrect.topLeft()):
                    self.scrollToItem(
                        item, QTreeWidget.PositionAtCenter)
                    itemrect = self.visualItemRect(item)
                itemrect.setLeft(portrect.left())
                itemrect.setWidth(portrect.width())
                pos = self.mapToGlobal(itemrect.center())
        if pos is not None:
            menu = QMenu(self)
            menu.addAction(item.text(0))
            menu.popup(pos)
        event.accept()


if __name__ == "__main__":

    import sys
    app = QApplication(sys.argv)
    tree = TreeWidget()
    tree.show()
    sys.exit(app.exec_())
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to