Your QDialog has a function called mapToGlobal(), which is inherits because
its a subclass of QWidget.
mapToGlobal takes a point that is local to the current object and remaps it
to the global position.

When your button calls that custom context menu slot, popup(), it passes it
the position (point) of where the
click occurred, so that you can popup your menu at that point.
Your menu has a method called exec_(), which will show the popup, start an
event loop, and block until the popup is done.
QMenu.exec_() takes a point as an argument of where to show the popup, so
we pass that global position into it.
exec_() will end once the popup closes.



On Wed, Dec 7, 2011 at 1:37 PM, notanymike <[email protected]> wrote:

> Yeah, I'm still unclear as to what's happening in the popup() function
> of the code. Specifically:
>
> action = menu.exec_(self.mapToGlobal(pos))
>
> I'm guessing it's just executing or generating the menu, but the extra
> _(self.mapToGlobal(pos)) I'm not sure how to use elsewhere...
>
>
> On Dec 6, 9:55 pm, Justin Israel <[email protected]> wrote:
> > You are making a simple dialog that only contains a pushbutton that is
> added to a vertical layout. You set the context menu option to use a custom
> menu instead of performing its own default action. And you connect a signal
> that is emitted when your right click the button to a custom slot that
> creates a popup menu and shows it.
> > Was there a specific area of the code you wanted more details about?
> >
> > On Dec 6, 2011, at 9:13 PM, notanymike <[email protected]> wrote:
> >
> >
> >
> >
> >
> >
> >
> > > I found a couple of tutorials and merged them and that seemed to work,
> > > though I still don't know how its working. Could anyone care to
> > > explain:
> >
> > > import sip
> > > import maya.cmds as cmds
> > > import maya.OpenMayaUI as mui
> > > from PyQt4.QtCore import *
> > > from PyQt4.QtGui import *
> >
> > > def getMayaWindow():
> > >    ptr = mui.MQtUtil.mainWindow()
> > >    return sip.wrapinstance(long(ptr), QObject)
> >
> > > class Form(QDialog):
> >
> > >    def __init__(self, parent=None):
> > >        super(Form, self).__init__(parent)
> > >        self.setObjectName('mainUI')
> > >        self.mainLayout = QVBoxLayout(self)
> > >        self.myButton = QPushButton('myButton')
> > >        self.myButton.setContextMenuPolicy(Qt.CustomContextMenu)
> > >        self.myButton.customContextMenuRequested.connect(self.popup)
> > >        self.myButton.clicked.connect(self.selectJoint)
> > >        self.mainLayout.addWidget(self.myButton)
> >
> > >    def popup(self, pos):
> > >        #for i in self.tv.selectionModel().selection().indexes():
> > >        #    print i.row(), i.column()
> > >        menu = QMenu()
> > >        jointAction = menu.addAction("This is an action")
> > >        action = menu.exec_(self.mapToGlobal(pos))
> > >        if action == jointAction:
> > >            self.myjoint = cmds.joint()
> >
> > >    def selectJoint(self):
> > >        cmds.select(self.myjoint)
> >
> > > global app
> > > global form
> > > app = qApp
> > > form = Form(getMayaWindow())
> > > form.show()
> >
> > > On Dec 2, 1:57 pm, Justin Israel <[email protected]> wrote:
> > >> Though this approach would make it a Menu button, activated from a
> normal
> > >> left click.
> >
> > >> On Fri, Dec 2, 2011 at 1:53 PM, David Moulder <
> [email protected]>wrote:
> >
> > >>> Alternatively you could try
> >
> > >>>    1.  QMenu <http://doc.qt.nokia.com/latest/qmenu.html> *menu =
> new QMenu<http://doc.qt.nokia.com/latest/qmenu.html>
> > >>>    (this);
> > >>>    2.  menu->addAction("Testaaaaaaaaaaaaaaaaaaaaa");
> > >>>    3.  menu->addAction("Test1");
> > >>>    4.  menu->addAction("Test2");
> > >>>    5.
> > >>>    6.  pushButton->setMenu(menu);
> >
> > >>> On Fri, Dec 2, 2011 at 9:47 PM, David Moulder <
> [email protected]>wrote:
> >
> > >>>> I'm not at python console to test this but from memory you need to
> set
> > >>>> the contextMenu property and then hook up the signal to slot to
> show your
> > >>>> menu.
> >
> > >>>> Qt::ContextMenuPolicy<
> http://doc.qt.nokia.com/latest/qt.html#ContextMenuPolicy-enum>
> >
> > >>>> and
> >
> > >>>>  customContextMenuRequested<
> http://doc.qt.nokia.com/latest/qwidget.html#customContextMenuRequested>
> >
> > >>>> Good luck.
> >
> > >>>> -Dave
> >
> > >>>> On Fri, Dec 2, 2011 at 9:13 PM, notanymike <[email protected]>
> wrote:
> >
> > >>>>> How can one make a drop-down command menu appear when
> right-clicking
> > >>>>> on a button in a Maya window using pyqt?
> >
> > >>>>> --
> > >>>>> view archives:http://groups.google.com/group/python_inside_maya
> > >>>>> change your subscription settings:
> > >>>>>http://groups.google.com/group/python_inside_maya/subscribe
> >
> > >>>> --
> > >>>> David Moulder
> > >>>>http://www.google.com/profiles/squish3d
> >
> > >>> --
> > >>> David Moulder
> > >>>http://www.google.com/profiles/squish3d
> >
> > >>> --
> > >>> view archives:http://groups.google.com/group/python_inside_maya
> > >>> change your subscription settings:
> > >>>http://groups.google.com/group/python_inside_maya/subscribe
> >
> > > --
> > > view archives:http://groups.google.com/group/python_inside_maya
> > > change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe
>
> --
> view archives: http://groups.google.com/group/python_inside_maya
> change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe
>

-- 
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings: 
http://groups.google.com/group/python_inside_maya/subscribe

Reply via email to