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

  • Qt Champions 2016

    hi and welcome
    Just a thought.
    When u make it visible,
    call setFocus on it and see if then
    first click works?



  • @mrjj Tried that, it was in the code after the .activateWindow but didn't have any effect.


  • Qt Champions 2016

    @MikeP
    Hmm. After it been shown first time, it will work all the time then ?
    Even if u click outside app and then directly to menu ?



  • @mrjj Yup!



  • @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.


  • Qt Champions 2016

    @MikeP said:
    hmm. it does sounds like a focus problem on initial show.

    You could try to create it visible and then override
    showEvent for mainwindow
    and there hide it.
    ( so when mainwin shows, it is still hidden)


  • Qt Champions 2016

    oh
    so it will do the same if hidden and shown again ?



  • @mrjj Yes


  • Qt Champions 2016

    @MikeP said:
    Ok, sorry cant explain.
    QGroupBox must steal first click to focus.

    What widgets do u put in this QGroupBox ?



  • @mrjj They are slightly modified QFrames or QLabels, the modification being to add the 'clicked' signal to the original. But setting the focus to the QGroupBox had no effect on the problem.


  • Qt Champions 2016

    @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.


  • Qt Champions 2016

    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!



  • Sidestepped the problem by substituting a toolbar for the menubar!


  • Qt Champions 2016

    @MikeP
    good workaround.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.