10

I want to display a standard warning icon along with some description text in QLabel in pyqt. Qlabel doesn't have setIcon function. So how could I do that?

Any help would be appreciated.

Angie Quijano
  • 3,308
  • 3
  • 20
  • 30
Ram Kumar
  • 131
  • 2
  • 2
  • 4

2 Answers2

18

QLabel doesn't have a setIcon method, but it has setPixmap. But if you use that to set a QPixmap it overrides your text. but there are a few possibilities to achieve what you want:

  • use the html-capabilities of the QLabel to display text+image
  • use two labels, one with the text and one with the image
  • paint the component yourself
mata
  • 60,113
  • 7
  • 139
  • 148
  • 2
    Would you mind adding an example showing how to "use the html-capabilities of the QLabel to display text+image"? – Freedom_Ben Jun 19 '14 at 20:38
  • 9
    That means just add an `` tag pointing to the image (`QLabel("")`) or image [resource](http://qt-project.org/doc/qt-5/resources.html) defined in your `.qrc` (`QLabel("")`) – mata Jun 19 '14 at 21:30
  • 3
    As displaying both a pixmap and text in the same `QLabel` is trivially feasible (if cumbersome) via the [`` hack above](https://stackoverflow.com/questions/10533838/displaying-a-standard-icon-and-text-in-qlabel#comment37584016_10574811), it's disappointing (if unsurprising) that `QLabel` supports no such functionality out-of-the-box. Why were `setPixmap()` and `setText()` forced to be mutually exclusive, when the two could have been made to simplistically cooperate in the obvious way (e.g., by prepending or appending text with an ``-wrapped pixmap in rich text mode)? – Cecil Curry Feb 27 '18 at 09:28
1

I know I'm a bit late to the party, but here's my solution to this problem:

import qtawesome as qta
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class IconLabel(QWidget):

    IconSize = QSize(16, 16)
    HorizontalSpacing = 2

    def __init__(self, qta_id, text, final_stretch=True):
        super(QWidget, self).__init__()

        layout = QHBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(layout)

        icon = QLabel()
        icon.setPixmap(qta.icon(qta_id).pixmap(self.IconSize))

        layout.addWidget(icon)
        layout.addSpacing(self.HorizontalSpacing)
        layout.addWidget(QLabel(text))

        if final_stretch:
            layout.addStretch()

I am using QtAwesome to get the desired icon.

Now you can easily insert the icon label into your own PyQt5 layout. Example.

mylayout.addWidget(IconLabel("fa.scissors", "Slicer Limit:"))

What it looks like:

enter image description here

Note that I included an option final_stretch. In a vertical layout, you'll want to keep final_stretch = True for proper left-alignment (see image avove). In a horizontal layout (i.e., when placing multiple IconLabels next to each other in the same row), however, you'll probably want to set final_stretch = False in order to save space.