Make QLabel clickable
Asked Answered
E

4

6

I have a Qlabel filled with QPixmap and I want to start a process/function once this label clicked. I had extended QLabel class as follows:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class QLabel_alterada(QLabel):
  clicked=pyqtSignal()
  def __init(self, parent):
    QLabel.__init__(self, QMouseEvent)

  def mousePressEvent(self, ev):
    self.clicked.emit()

Then, in my pyuic5-based .py file (I used QtDesigner to do the layout) after importing the module where I save the extended QLabel class, inside the automatically generated setupui, function I changed my Label from

self.label1=QtWidgets.QLabel(self.centralwidget)

to

self.label1 = QLABEL2.QLabel_alterada(self.centralwidget)

Finally, in the core app Python file where I put all the procedures/classes whetever needed to the application functionality I added

self.ui.label1.clicked.connect(self.dosomestuff) 

The application does not crashes but the labels still not clickable. Can someone give me some help on this?

Eatage answered 8/8, 2017 at 18:31 Comment(12)
I have posted a answer but if it is not enough you could provide the code generated by QtDesigner where you made the modifications.Lacto
tks @eyllanesc. It is still unclickable. The unique change that I made in the code generated by QtDesigner was with respect to the Qlabel object that I want to transform into "clickable". I referred this change in my post. Do you think it can be related to "self.centralWidget" as parameter to the QLabel_alterada class?Eatage
Yes, you can do it, I think the error is elsewhere, so I ask you for the code that QtDesigner generates with the changes you have made.Lacto
You could show the folder structure you use.Lacto
@Lacto I have a unique folder containing both the .py file with code generated by pyuic and the file containing the core app. This folder also contains the file where I save my QLabel extended class. The code from QtDesigner is huge with all the setobjectnames, addwidgets, addlayouts and things like that that qtdesigner+pyuic automatically handleEatage
You could share the code through github, drive or similar.Lacto
In the following link is all the code and to make it easy to visualize the QLabel I added a black background: gist.github.com/eyllanesc/9432afa8af9cf46ef262c96cfd1ef43eLacto
Probe your code and you pass the link, did it work?Lacto
Your code works for me, just add colors so you can see where to click.Lacto
You could share the complete code, with images and everything you need to please, to test it and give you my opinion.Lacto
I already figured it out! I really appreciate your help. Thank you so muchEatage
If my answer helps you please do not forget to mark it as correct please.Lacto
L
8

I do not understand why you pass QMouseEvent to the parent constructor, you must pass the parent attribute as shown below:

class QLabel_alterada(QLabel):
    clicked=pyqtSignal()

    def mousePressEvent(self, ev):
        self.clicked.emit()

To avoid having problems with imports we can directly promote the widget as shown below:

We place a QLabel and right click and choose Promote to ...:

enter image description here

We get the following dialog and place the QLABEL2.h in header file and QLabel_changed in Promoted class Name, then press Add and Promote

enter image description here

Then we generate the .ui file with the help of pyuic. Obtaining the following structure:

├── main.py
├── QLABEL2.py
└── Ui_main.ui

Obtaining the following structure:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.label.clicked.connect(self.dosomestuff) 

    def dosomestuff(self):
        print("click")


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
Lacto answered 8/8, 2017 at 18:56 Comment(0)
E
5

Since Python can pass function as object, I think make a class inherit QLabel only to make it clickable is overkill. Instead I do like this:

import sys

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QFrame, QLabel


def foo(*arg, **kwargs):
   print("Bar")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    Frame = QFrame()
    label = QLabel(Frame)
    label.mousePressEvent = foo
    label.setText("Label")
    Frame.show()
    sys.exit(app.exec_())
Elegit answered 12/5, 2022 at 3:28 Comment(1)
label.mousePressEvent = lambda _: NoneVicarage
C
0
class ClickableLabel(QtWidgets.QLabel):
    def __init__(self, whenClicked, parent=None):
        QtWidgets.QLabel.__init__(self, parent)
        self._whenClicked = whenClicked

    def mouseReleaseEvent(self, event):
        self._whenClicked(event)

and then:

        my_label = ClickableLabel(self.my_label_clicked)
...
    def my_label_clicked(self, event):
        button = event.button()
        modifiers = event.modifiers()

        if modifiers == Qt.NoModifier and button == Qt.LeftButton:
            logger.debug('my_label_clicked: hooray!')
            return

        LOGGER.debug('my_label_clicked: unhandled %r', event)
Canuck answered 28/10, 2020 at 16:39 Comment(0)
V
-1

In PyQT5, you can try to add code in setupUi and create clicked method:

def setupUi()
   ... 
   self.label1.linkActivated.connect(self.clicked)
   ...

def clicked(self):
    print(self.label1.text()) #For example, printing the label text...

Hope this helps!

Veolaver answered 17/1, 2023 at 14:47 Comment(1)
linkActivated is being called when the UI is being loaded, without even clicking the label.Spectroradiometer

© 2022 - 2024 — McMap. All rights reserved.