0

I'm creating a side menu using pyqt4.

I turned the QLabel (burgermenu) into a picture of a burger menu, and I'm having trouble making it clickable.

My intension is that when I click the burgermenu image, the inner frame (innerframe) hides totally, and when I click burgermenu again; the innerframe appears with its content.

How can I achieve that?

Here is my code:

from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import *

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(479, 381)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.outerframe = QtGui.QFrame(self.centralwidget)
        self.outerframe.setGeometry(QtCore.QRect(190, 80, 151, 211))
        self.outerframe.setFrameShape(QtGui.QFrame.StyledPanel)
        self.outerframe.setFrameShadow(QtGui.QFrame.Raised)
        self.outerframe.setObjectName(_fromUtf8("outerframe"))
        self.burgermenu = QtGui.QLabel(self.outerframe)
        self.burgermenu.setGeometry(QtCore.QRect(70, 10, 71, 20))
        self.burgermenu.setObjectName(_fromUtf8("burgermenu"))
        self.innerframe = QtGui.QFrame(self.outerframe)
        self.innerframe.setGeometry(QtCore.QRect(10, 60, 131, 141))
        self.innerframe.setFrameShape(QtGui.QFrame.StyledPanel)
        self.innerframe.setFrameShadow(QtGui.QFrame.Raised)
        self.innerframe.setObjectName(_fromUtf8("innerframe"))
        self.widget = QtGui.QWidget(self.innerframe)
        self.widget.setGeometry(QtCore.QRect(20, 30, 91, 99))
        self.widget.setObjectName(_fromUtf8("widget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.widget)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.label_2 = QtGui.QLabel(self.widget)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.verticalLayout.addWidget(self.label_2)
        self.dateEdit = QtGui.QDateEdit(self.widget)
        self.dateEdit.setObjectName(_fromUtf8("dateEdit"))
        self.verticalLayout.addWidget(self.dateEdit)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 479, 22))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.burgermenu.setText(_translate("MainWindow", "burgermenu", None))
        self.burgermenu.setPixmap(QPixmap("/Users/Desktop/menu.png"))
        self.label_2.setText(_translate("MainWindow", "Date:", None))

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
fullon
  • 11
  • 1
  • 5

2 Answers2

1

Here you can use method name mousePressEvent

self.burgermenu.mousePressEvent = self.dosomething

after that in dosomething method you can call method called hide or show for innerframe.

self.innerframe.hide()

or

self.innerframe.show()

and dont forget to add event as parameter in dosomething

0

you can overwrite the mousePressEvent of the QLabel like:

def setupClickToggle(self):
    def mousePressEvent(*args, **kwargs):
        self.innerframe.setVisible(not self.innerframe.isVisible())
    self.burgermenu.mousePressEvent = mousePressEvent

and you simply call it once in your init or during startup:

MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
setupClickToggle(MainWindow)
MainWindow.show()
Skandix
  • 1,916
  • 6
  • 27
  • 36
  • Thank you for the reply! what should the *args **kwargs be? (sorry I'm a beginner) – fullon Apr 05 '18 at 11:27
  • when the event-function is called, additional arguments are given (which we don't use). Using "args" and "kwargs" is just a convention. We need to provide the space for these arguments to prevent an exception. More Info: [What does ** (double star/asterisk) and * (star/asterisk) do for parameters?](https://stackoverflow.com/a/36908/4464653) and [*args and **kwargs?](https://stackoverflow.com/a/3394898/4464653) – Skandix Apr 05 '18 at 11:37
  • Thank you! although when I use it a TypeError shows. TypeError: setupClickToggle() takes exactly 2 arguments (1 given). Any idea how can I fix it? – fullon Apr 05 '18 at 11:42
  • 1
    Worked! Thank you so much! Have a nice day/night <3 – fullon Apr 05 '18 at 11:50