[PyKDE] Event chaining and passing parameters

David Boddie david at boddie.org.uk
Fri Sep 17 11:40:12 BST 2004


On Thu, 16 Sep 2004 12:57:55, Jim Bublitz wrote: 
 
>On Thursday 16 September 2004 12:22, Timothy Grant wrote: 
 
>> There are two comments in the code showing what I'd like to accomplish 
 
[...] 
 
>>     def edit(self): 
>>         print "editing" 
>>         #how do I get item down here? 
> 
>           item = self.list.selectedItem () 
> 
>setCurrentItem/currentItem would also work. If you don't want the selected 
>or current items to change, you'd need to create your own variable (probably 
>in DetailList?) and then make ContextPopupMenu aware of the the DetailList 
>instance it corresponds to (via its __init__ method) so it can set the 
>value of the variable - basically the same thing. 
 
You can also store the item in the popup menu and retrieve it later: 
 
class ContextPopupMenu(QPopupMenu): 
    def __init__(self, *args): 
        apply(QPopupMenu.__init__, (self,) + args) 
 
        self.editAction = QAction(self) 
        self.editAction.setText('Edit') 
        self.editAction.setMenuText('&Edit') 
        self.editAction.setStatusTip('Edit Stuff') 
        self.editAction.addTo(self) 
 
    def showMenu(self, item, pos): 
        #item is very useful here 
        self.item = item 
        self.exec_loop(pos) 
 
[In the main window class] 
 
    def edit(self): 
        print "editing" 
        # The sender is the action. Its parent is the popup menu. 
        # We recorded the list item in the popup menu. 
        print self.sender().parent().item 
 
This is a little indirect, so it might be better to use the popup menu's 
activated signal rather than the signal from the action: 
 
from qt import * 
 
class ContextPopupMenu(QPopupMenu): 
    def __init__(self, *args): 
        apply(QPopupMenu.__init__, (self,) + args) 
  
        self.editAction = QAction(self) 
        self.editAction.setText('Edit') 
        self.editAction.setMenuText('&Edit') 
        self.editAction.setStatusTip('Edit Stuff') 
        self.editAction.addTo(self) 
  
    def showMenu(self, item, pos): 
        #item is very useful here 
        self.item = item 
        self.exec_loop(pos) 
 
class DetailList(QListView): 
    def __init__(self, parent): 
        QListView.__init__(self, parent) 
        self.addColumn("Items") 
        for i in range(0, 10): 
            item = QListViewItem(self) 
            item.setText(0, "Item %i" % i) 
 
class VagabondWindow(QMainWindow): 
    def __init__(self, library, *args): 
        apply(QMainWindow.__init__, (self,) + args) 
 
        self.context_menu = ContextPopupMenu() 
 
        self.list = DetailList(self) 
 
        self.connect(self.list, 
            SIGNAL('contextMenuRequested(QListViewItem *, const QPoint &, 
int)'), 
            self.context_menu.showMenu) 
 
        # Use a signal from the popup menu rather than from the 
        # action itself. 
        self.connect(self.context_menu, SIGNAL('activated(int)'), self.edit) 
        self.setCentralWidget(self.list) 
 
    def edit(self): 
        print "editing" 
        # The sender is now the popup menu. We recorded the item inside the 
        # menu. 
        print self.sender().item, self.sender().item.text(0) 
 
Hope this helps, 
 
David 


___________________________________________________________
$0 Web Hosting with up to 120MB web space, 1000 MB Transfer
10 Personalized POP and Web E-mail Accounts, and much more.
Signup at www.doteasy.com




More information about the PyQt mailing list