Newbie question, first mouse click ignored in submenu
-
The application has a main window with a menubar, some submenus are created using GroupBoxes and clickable Frames or Labels because the menu entries are graphical rather than textual.
If the groupbox is made permanently visible when created then the first mouse-click within the group is always accepted. If the groupbox is not visible when created (the required state, as below) and made visible when required the first mouse-click within the group is always ignored.
Any suggestions as to how to fix this?
edited code (mnuColour and mnuOffset are created in the same manner as mnuWidth); -
class Ui_measWindow(object): def setupUi(self, measWindow): measWindow.setObjectName(_fromUtf8("measWindow")) measWindow.resize(1026, 790) measWindow.setWindowTitle(_fromUtf8("Measure")) measWindow.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedKingdom)) self.centralwidget = QtGui.QWidget(measWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) QtCore.QObject.connect(self.centralwidget, QtCore.SIGNAL(_fromUtf8("clicked()")), self.showHide) self.videoFrame = QtGui.QLabel(self.centralwidget) self.videoFrame.setGeometry(QtCore.QRect(0, 0, 1024, 768)) self.videoFrame.setObjectName(_fromUtf8("videoFrame")) self.MainWindow = measWindow # create width select submenu self.mnuWidth = QtGui.QGroupBox(self.centralwidget) self.mnuWidth.setGeometry(QtCore.QRect(20, 0, 60, 180)) self.mnuWidth.setAutoFillBackground(True) self.mnuWidth.setTitle(_fromUtf8("")) self.mnuWidth.setAlignment(QtCore.Qt.AlignCenter) self.mnuWidth.setFlat(False) self.mnuWidth.setObjectName(_fromUtf8("mnuWidth")) self.mnuWidth.setVisible(False) for i in range (1, 9): lName = 'line_'+str(i) lineWid = wids[i-1] self.lName = extQFrame.extQFrame(self.mnuWidth) self.lName.setGeometry(QtCore.QRect(10, 20*i, 40, 16)) self.lName.setFrameShadow(QtGui.QFrame.Plain) self.lName.setLineWidth(lineWid) self.lName.setMidLineWidth(0) self.lName.setFrameShape(QtGui.QFrame.HLine) self.lName.setFrameShadow(QtGui.QFrame.Plain) self.lName.setObjectName(_fromUtf8(lName)) QtCore.QObject.connect(self.lName, QtCore.SIGNAL(_fromUtf8("clicked()")), self.btnClicked) blah, blah... measWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(measWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1024, 25)) self.menubar.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) self.menubar.setObjectName(_fromUtf8("menubar")) # create width select top menu self.menuLine_width = QtGui.QMenu(self.menubar) QtCore.QObject.connect(self.menuLine_width, QtCore.SIGNAL(_fromUtf8("aboutToShow()")), self.showHide) self.menuLine_width.setObjectName(_fromUtf8("menuLine_width")) blah, blah... def hideAll(self): self.mnuWidth.setVisible(False) self.mnuColour.setVisible(False) self.mnuOffset.setVisible(False) def showHide(self): # hide all, then show required menu self.hideAll() menuID = self.MainWindow.sender().objectName() if menuID.endsWith('width') == True: self.mnuWidth.setVisible(True) self.mnuWidth.activateWindow() # added to see if it helps, doesn't elif menuID.endsWith('colour') == True: self.mnuColour.setVisible(True) self.mnuColour.activateWindow() elif menuID.endsWith('Offset') == True: self.mnuOffset.setVisible(True) self.mnuOffset.activateWindow() def btnClicked(self): # menu item clicked, process and action global lWidth, lColour, mOffset buttonID = self.MainWindow.sender() pName = buttonID.objectName() pNum = num.search(pName) pNum = int(pNum.group()) if pName.startsWith('line') == True: lWidth = pNum-1 elif pName.startsWith('col') == True: lColour = pNum-1 elif pName.startsWith('off') == True: mOffset = pNum-1 # clear menus & update display self.hideAll() self.showChange()
-
hi and welcome
Just a thought.
When u make it visible,
call setFocus on it and see if then
first click works? -
@mrjj Sorry, not entirely sure but I think clicking outside the app doesn't affect what happens when you come back to the menu providing the menu is still displayed. After a valid click the menu is hidden anyway and whenever it is re-displayed the first click is ignored.
-
oh
so it will do the same if hidden and shown again ? -
@MikeP
Hmm I tried with
https://wiki.qt.io/Clickable_QLabel
Which sounds like what you have but
show/hiding the QGroupBox did not eat first click.I think we need a fellow Python user to find this :)
seems not to happen in c++- well not in my sample anyway. -
@mrjj I have found that, once the menu is displayed, if I click in the main window before clicking in the menu then the click on the menu is accepted. Unfortunately I don't have enough experience of Python to know where to go next, I'll keep trying odds and sods in the meantime.
-
It really sounds like it just dont have
focus. but it should.
Well im even bigger python noob :) -
@mrjj Using focusChanged I have determined that, when the mouse clicks on the menubar the focus is given to the menubar object, as expected and the QGroupBox is displayed. If I do not deliberately setFocus to the QGroupBox then the first click in the QGroupBox removes the focus from the menubar to None. Subsequent clicks in the QGroupBox set the focus to the menubar, the click is processed and the focus goes back to None. If I deliberately setFocus to the QGroupBox then focus transfers to the QGroupBox, then the first click in the QGroupBox removes the focus from the QGroupBox but is not processed. Subsequent clicks in the QGroupBox set the focus to the QGroupBox, the click is processed and the focus goes back to None!