Динамическое изменение размера QIcon без вызова setSizeIcon ()

В настоящее время я борюсь с тем, что должно быть легко решить вопрос. Многие виджеты поддерживают какие-то QSizePolicy. Это включает в себя QPushButton. В моем случае у меня есть несколько кнопок в сетке, каждая из которых имеет свой QSizePolicy для обоих вертикальный и горизонтальный изменение размера установлено на расширяющийся. Это приводит к тому, что размер кнопок изменяется в соответствии с размером виджета, частью которого является сетка.

Проблема заключается в том, как иконки обрабатываются в Qt. QIcon не имеет свойства QSizePolicy (или, по крайней мере, мне не удалось найти его в официальной документации Qt4 о QIcon а также QAbstractButton). Кажется, единственный способ использовать setIconSize () где вы можете указать максимальный размер иконки. Кроме того, необходимо вручную внедрить процедуру обновления размера. В этом случае это будет (реферат здесь) icon.size == button.size-CONSTANT, где CONSTANT — это некоторый предопределенный фактор (> = 0). Предварительное определение различных размеров (список значков QI) для выбранного значка также возможно, но все еще не является хорошим вариантом (см. Ниже, почему).

Похоже, это немного излишне, особенно если учесть, что QPushbutton поддерживает QSizePolicy, и разработчику вообще не нужно возиться с этим, если он / она не хочет какого-то особого изменения размера. Также этот вид противоречит поддержке файлов SVG, которые могут быть использованы в QIcon поскольку, как мы знаем, SVG = векторная графика = вы можете растягивать их сколько угодно без потери качества.

Кто-нибудь знает простой способ сделать это без необходимости добавления дополнительных четных ручек для изменения размера, предоставления списка масштабов выбранного значка или ограничения размера до максимального размера?

PS: я также изучил QPixmap — там все те же проблемы.

РЕДАКТИРОВАТЬ:
Я забыл упомянуть один способ, которым я узнал, как делать то, что я хотел (однако результаты не так хороши, как хотелось бы) — используя образ свойство в таблице стилей для QPushbutton, Это, однако, не создает значок! Если вам действительно не нужен настоящий значок и вы можете просто использовать нарисованную кнопку, использование этого свойства дает огромную гибкость в плане изменения размера, особенно при использовании SVG.

1

Решение

Sub-причислять QPushButton, как предлагает @Pavel в комментарии, кажется разумным вариантом для решения вашей проблемы. Ниже я приведу простой пример, который показывает, как это можно сделать в 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_())

Что приводит к:

введите описание изображения здесь

Максимальный размер значка ограничен размером png используется как вход в QIcon, Если svg используется как вход для QIconмасштабирование иконки не будет ограничено в размере. Тем не менее, иконки SVG, похоже, не поддерживаются в Windows7, но они есть в Ubuntu.

Приведенный выше код необходимо будет расширить, если добавить метку к кнопке. Более того, при желании можно также масштабировать размер шрифта надписи до размера кнопки.

3

Другие решения

Лицам, которые работают на C ++. Большое спасибо !

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector