Округлая иконка на Qpushbutton

У меня есть QPushButton, к которому я хочу добавить значок (который я добавляю к кнопке с помощью QPushButton::setIcon()) с закругленными углами. Однако у меня есть растровое изображение, которое представляет собой квадратное изображение. Можно ли адаптировать растровое изображение таким образом, чтобы оно стало закругленным?

Я нашел функцию setMask() на QPixmap, которую, возможно, смогу использовать. Но как мне сделать растровое изображение, маскирующее края моего QPixmap?

Или есть лучший способ для этого?


person Frank    schedule 13.04.2016    source источник
comment
Есть ли прозрачность на вашем значке? Вы пытались использовать setStyleSheet(); ? Это позволяет вам использовать CSS на вашем QPushButton :)   -  person Antoine Morrier    schedule 13.04.2016
comment
Значок представляет собой квадрат динамического цвета. Непрозрачность зависит от кнопки. Не знаю, как здесь помогут таблицы стилей. Я устанавливаю значок с помощью QPushButton::setIcon(). Можно ли манипулировать этим значком через таблицы стилей?   -  person Frank    schedule 13.04.2016
comment
Я действительно не понимаю, в чем проблема... Если ваш значок имеет прозрачное значение, вы можете использовать их. Однако, если вы просто хотите иметь закругленный значок, одним из способов может быть использование QLabel (например, с помощью таблицы стилей, радиуса границы и т. д.) и размещение этого QLabel поверх вашего QPushButton?   -  person Antoine Morrier    schedule 13.04.2016


Ответы (1)


Вот как вы можете подготовить QPixmap с закругленными углами:

const QPixmap orig = QPixmap("path to your image");

// getting size if the original picture is not square
int size = qMax(orig.width(), orig.height());

// creating a new transparent pixmap with equal sides
QPixmap rounded = QPixmap(size, size);
rounded.fill(Qt::transparent);

// creating circle clip area
QPainterPath path;
path.addEllipse(rounded.rect());

QPainter painter(&rounded);
painter.setClipPath(path);

// filling rounded area if needed
painter.fillRect(rounded.rect(), Qt::black);

// getting offsets if the original picture is not square
int x = qAbs(orig.width() - size) / 2;
int y = qAbs(orig.height() - size) / 2;
painter.drawPixmap(x, y, orig.width(), orig.height(), orig);

Затем вы можете использовать полученное растровое изображение для установки значка QPushButton:

QPushButton *button = new QPushButton(this);
button->setText("My button");
button->setIcon(QIcon(rounded));

И, конечно же, у вас есть второй вариант — использовать какой-нибудь редактор изображений, чтобы заранее подготовить изображения со скругленными углами.

person hank    schedule 13.04.2016