1

I have a gridlayout that holds a bunch of check boxes. I wanted to add an image to the check boxes as well as some text. The problem I am having is that the layout of a check box is left to right (check box, icon, text).

Is there a way to put the text above the icon? Not sure if using a style sheet would work for this or not or even how that would look.

Thank you.

Chris Mattmiller
  • 325
  • 3
  • 14

1 Answers1

0

Answer : In PyQt4. No, your can't do it.

Why ? I read source code of QCheckBox Qt4 (C++) here and here. I saw it use default QStyleOptionButton to show check box, text and icon. It's use drawControl to draw all element in QStyleOptionButton by specified config in QStyleOptionButton. Also it have LayoutDirection. And layout direction in QStyleOptionButton. I don't know in Qt4 C++ and inheritance it and swap direction icon. But in PyQt4, It's impossible to do it.

Another way ? : Yes, It have another way to solve but not directly. Your just create your own widget just like QCheckBox and disable icon in QCheckBox and make your own QLabel ot show your icon and set it with same QLayout.

Example;

import sys
from PyQt4 import QtGui, QtCore

class QCustomCheckBox (QtGui.QWidget):
    stateChanged = QtCore.pyqtSignal(int)

    def __init__ (self, text, parentQWidget = None):
        super(QCustomCheckBox, self).__init__(parentQWidget)
        self.customQCheckBox = QtGui.QCheckBox(text)
        self.iconQLabel      = QtGui.QLabel()
        allQHBoxLayout  = QtGui.QHBoxLayout()
        allQHBoxLayout.addWidget(self.customQCheckBox)
        allQHBoxLayout.addWidget(self.iconQLabel)
        allQHBoxLayout.addStretch(1)
        self.setLayout(allQHBoxLayout)
        self.customQCheckBox.stateChanged.connect(self.stateChanged.emit)

    def setPixmap (self, newQPixmap, width = 48, height = 48):
        self.iconQLabel.setPixmap(newQPixmap.scaled(width, height, QtCore.Qt.KeepAspectRatio))

    def pixmap (self):
        return self.iconQLabel.pixmap()

class QCustomWidget (QtGui.QWidget):
    def __init__ (self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        allQVBoxLayout  = QtGui.QVBoxLayout()
        firstQCustomCheckBox = QCustomCheckBox('First Check Box')
        firstQCustomCheckBox.setPixmap(QtGui.QPixmap('1.jpg'))
        allQVBoxLayout.addWidget(firstQCustomCheckBox)
        secondQCustomCheckBox = QCustomCheckBox('Second Check Box')
        secondQCustomCheckBox.setPixmap(QtGui.QPixmap('2.jpg'))
        allQVBoxLayout.addWidget(secondQCustomCheckBox)
        self.setLayout(allQVBoxLayout)

if __name__ == '__main__':
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomWidget = QCustomWidget()
    myQCustomWidget.show()
    sys.exit(myQApplication.exec_())
Bandhit Suksiri
  • 3,390
  • 1
  • 18
  • 20