Element color in custom style



  • Hi!
    I'm creating a custom style from QProxyStyle and I need the arrow indicator to be white because the background is dark:

    def drawPrimitive(self, element, opt, painter, widget):
            if element == QStyle.PE_PanelButtonTool:
                pressed = (opt.state & STATE_SUNKEN | opt.state & STATE_ON)
                color = QColor("#323232")
                if pressed:
                    color = QColor("#222222")
                elif opt.state & STATE_ENABLED and opt.state & STATE_MOUSEOVER:
                    color = QColor("#4e4e4e")
                painter.fillRect(opt.rect, color)
            elif element == QStyle.PE_IndicatorArrowDown:
                painter.setBrush(QColor("white"))
                QProxyStyle.drawPrimitive(self, element, opt, painter, widget)
            else:
                QProxyStyle.drawPrimitive(self, element, opt, painter, widget)
    
    


    But that doesn't work, I'm forgetting something?

    Thanks!


  • Qt Champions 2016

    Hi

    QStyle.PE_IndicatorArrowDown:

    Are you sure that it draws any background and not just an image ?
    I would go and look at the original code to see what is being drawn.

    https://code.woboq.org/qt5/qtbase/src/widgets/styles/qcommonstyle.cpp.html
    Line 707

    Seems to be no brush involved :)



  • @mrjj Thank you very much! I have researched and been able to do what I was looking for. Here's what I did:

    def drawPrimitive(self, element, opt, painter, widget):
            if element == QStyle.PE_PanelButtonTool:
                pressed = (opt.state & STATE_SUNKEN | opt.state & STATE_ON)
                color = QColor("#323232")
                if pressed:
                    color = QColor("#222222")
                elif opt.state & STATE_ENABLED and opt.state & STATE_MOUSEOVER:
                    color = QColor("#4e4e4e")
                painter.fillRect(opt.rect, color)
            elif element == QStyle.PE_IndicatorArrowDown or \
                    element == QStyle.PE_IndicatorArrowUp:
                r = opt.rect
                size = min(r.height(), r.width())
                image = QImage(size, size, QImage.Format_ARGB32_Premultiplied)
                image.fill(Qt.transparent)
                image_painter = QPainter(image)
                image_painter.setPen(QColor("#bdbfc0"))
                image_painter.setBrush(QColor("#bdbfc0"))
                polygon = QPolygon()
                polygon.append(QPoint(0, r.width() * 0.5))
                if element == QStyle.PE_IndicatorArrowDown:
                    polygon.append(QPoint(size, size * 0.6))
                    polygon.append(QPoint(size / 2, size * 0.1))
                else:
                    polygon.append(QPoint(size, size * 0.5))
                    polygon.append(QPoint(size / 2, size * 0.9))
                image_painter.drawPolygon(polygon)
                image_painter.end()
                pixmap = QPixmap.fromImage(image)
    
                painter.drawPixmap(r.x() + (r.width() - size) / 2,
                                   r.y() + (r.height() - size) / 2, pixmap)
            else:
                QProxyStyle.drawPrimitive(self, element, opt, painter, widget)
    

    Regards!



Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.