【问题标题】:Clickable QLabel in PyQt? [duplicate]PyQt中的可点击QLabel? [复制]
【发布时间】:2018-09-15 03:55:54
【问题描述】:

我正在使用 pyqt4 创建一个侧边菜单。

我将 QLabel (burgermenu) 变成了汉堡菜单的图片,但无法使其可点击。

我的意图是当我点击burgermenu图像时,内框(innerframe)完全隐藏,当我再次点击burgermenu时;内框连同其内容一起出现。

我怎样才能做到这一点?

这是我的代码:

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

【问题讨论】:

    标签: python qt pyqt pyqt4 qt-designer


    【解决方案1】:

    这里可以使用方法名mousePressEvent

    self.burgermenu.mousePressEvent = self.dosomething
    

    之后,在 dosomething 方法中,您可以为内框调用名为 hide 或 show 的方法。

    self.innerframe.hide()
    

    self.innerframe.show()
    

    别忘了在dosomething中添加event作为参数

    【讨论】:

      【解决方案2】:

      您可以覆盖QLabel 中的mousePressEvent,例如:

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

      您只需在初始化或启动期间调用一次:

      MainWindow = QtGui.QMainWindow()
      ui = Ui_MainWindow()
      ui.setupUi(MainWindow)
      setupClickToggle(MainWindow)
      MainWindow.show()
      

      【讨论】:

      • 感谢您的回复! *args **kwargs 应该是什么? (对不起,我是初学者)
      • 当事件函数被调用时,会给出额外的参数(我们不使用)。使用“args”和“kwargs”只是一个约定。我们需要为这些参数提供空间以防止异常。更多信息:What does ** (double star/asterisk) and * (star/asterisk) do for parameters?*args and **kwargs?
      • 谢谢!虽然当我使用它时会显示 TypeError。 TypeError:setupClickToggle() 正好采用 2 个参数(给定 1 个)。知道如何解决吗?
      • 成功了!太感谢了!有一个美好的白天/夜晚
      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2017-10-22
      相关资源
      最近更新 更多