Dynamically resize QIcon without calling setSizeIcon()

前端 未结 2 642
无人共我
无人共我 2021-01-20 18:01

I\'m currently struggling with what should be an easy issue to solve. Many widgets support some sort of QSizePolicy. This includes the QPushbutton

相关标签:
2条回答
  • 2021-01-20 18:19

    Sub-classing QPushButton, as suggested by @Pavel in a comment, seems like a reasonable option to solve your issue. Below I provide a simple example that shows how this can be done in PySide.

    import sys
    from PySide import QtGui, QtCore
    
    class myContainter(QtGui.QWidget):
        def __init__(self, parent=None):
            super(myContainter, self).__init__(parent)
    
            icon = QtGui.QIcon('process-stop.png')
    
            grid = QtGui.QGridLayout()
    
            for i in range(3):
                button = myPushButton()
                button.setIcon(icon) 
    
                grid.addWidget(button, i, 0)
    
                grid.setRowStretch(i, i)
    
            self.setLayout(grid)
    
    
    class myPushButton(QtGui.QPushButton):
        def __init__(self, label=None, parent=None):
            super(myPushButton, self).__init__(label, parent)
    
            self.pad = 4     # padding between the icon and the button frame
            self.minSize = 8 # minimum size of the icon
    
            sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                           QtGui.QSizePolicy.Expanding)
            self.setSizePolicy(sizePolicy)
    
        def paintEvent(self, event):
    
            qp = QtGui.QPainter()
            qp.begin(self)
    
            #---- get default style ----
    
            opt = QtGui.QStyleOptionButton()
            self.initStyleOption(opt)
    
            #---- scale icon to button size ----
    
            Rect = opt.rect
    
            h = Rect.height()
            w = Rect.width()
            iconSize = max(min(h, w) - 2 * self.pad, self.minSize)
    
            opt.iconSize = QtCore.QSize(iconSize, iconSize)
    
            #---- draw button ----
    
            self.style().drawControl(QtGui.QStyle.CE_PushButton, opt, qp, self)
    
            qp.end()
    
    if __name__ == '__main__':
    
        app = QtGui.QApplication(sys.argv)
    
        instance = myContainter()  
        instance.show()    
    
        sys.exit(app.exec_())
    

    Which results in:

    The maximum size of the icon is limited by the size of the png used as input in QIcon. If a svg is used as input for the QIcon, the scaling of the icon won't be limited in size. However, svg icons seems not to be supported in Windows7, but they are in Ubuntu.

    The code above would need to be expanded if a label is added to the button. Moreover, it would be possible to also scale the font size of the label to the button size if desired.

    0 讨论(0)
  • 2021-01-20 18:25

    To persons who work in C++. Thanks a lot !

    pushbuttoniconautoresize.h

    #ifndef PUSHBUTTONIMAGEAUTOMATICRESIZE_H
    #define PUSHBUTTONIMAGEAUTOMATICRESIZE_H
    
    #include <QPushButton>
    
    class PushButtonIconAutoResize : public QPushButton
    {
        Q_OBJECT
    
    public:
        PushButtonIconAutoResize(const QString &text, QWidget *parent=0);
        ~PushButtonIconAutoResize();
    
    private:
        void paintEvent(QPaintEvent *event);
    
        int pad;
        int minSize;
    };
    
    #endif // PUSHBUTTONIMAGEAUTOMATICRESIZE_H
    

    pushbuttoniconautoresize.cpp

    #include "pushbuttoniconautoresize.h"
    
    #include <QSize>
    #include <QSizePolicy>
    #include <QStylePainter>
    #include <QStyleOptionButton>
    #include <QtGlobal>
    
    PushButtonIconAutoResize::PushButtonIconAutoResize(const QString &text, QWidget *parent)
        : QPushButton(text, parent)
    {
        pad = 4;
        minSize = 8;
    
        this->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
    }
    
    PushButtonIconAutoResize::~PushButtonIconAutoResize()
    {
    
    }
    
    void PushButtonIconAutoResize::paintEvent( QPaintEvent *event )
    {
        QStylePainter painter(this);
    
        QStyleOptionButton opt;
        this->initStyleOption(&opt);
    
        QRect r = opt.rect;
    
        int h = r.height();
        int w = r.width();
        int iconSize = qMax(qMin(h, w) - 2 * this->pad, this->minSize);
    
        opt.iconSize = QSize(iconSize, iconSize);
    
        painter.drawControl(QStyle::CE_PushButton, opt);
    }
    
    0 讨论(0)
提交回复
热议问题