Можно ли использовать настраиваемые масштабируемые изображения для QRadioButton? - PullRequest
1 голос
/ 10 января 2020

С помощью простого QPushButton, если я хочу использовать пользовательские изображения, в то время как размер кнопки определяется макетом (поэтому его можно свободно масштабировать), единственная возможность - переопределить border-image в таблице стилей. Если я добавлю изображение в качестве атрибута image вместо border-image, изображения не будут уменьшены.

Однако, если я использую QRadioButton и переопределю image или border-image, Круг переключателя остается видимым. Я не нашел способа скрыть или переопределить его.

Возможно, можно будет игнорировать метку и изменить сам значок круга. Это можно сделать, переопределив QRadioButton:indicator, однако он не принимает border-image, он принимает только image, который не масштабируется.

Есть ли способ решить эту проблему, или я застрял с использованием QPushButton с setCheckable(true) и обрабатывать другие кнопки вручную при каждом нажатии одной из них?

Я попытался указать изображение границы для метки и несуществующее изображение для индикатора:

ui->radioButton->setStyleSheet(
"QRadioButton { border-image: url(:/img/off.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:checked { border-image: url(:/img/on.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:pressed { border-image: url(:/img/off_pressed.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:checked:pressed { border-image: url(:/img/on_pressed.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:indicator:unchecked {image: url()}"
"QRadioButton:indicator:checked {image: url()}"
"QRadioButton:indicator:unchecked:pressed  {image: url()}"
"QRadioButton:indicator:checked:pressed {image: url()}"
);

Проблема в том, что хотя круг теперь не виден, он все равно занимает место, поэтому изображение не заполняет все доступное пространство.

1 Ответ

1 голос
/ 10 января 2020

Сокращение размера индикатора до нуля, кажется, работает. Это все еще уродливый хак (поскольку Qt по-прежнему не поддерживает масштабируемые изображения для кнопок и надписей, если они не определены как изображения границ), но это работает.

ui->radioButton->setStyleSheet(
"QRadioButton { border-image: url(:/img/off.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:checked { border-image: url(:/img/on.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:pressed { border-image: url(:/img/off_pressed.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:checked:pressed { border-image: url(:/img/on_pressed.png) 0 0 0 0 stretch stretch; }"
"QRadioButton:indicator {width: 0px; height: 0px;}"
);

Недостаток это решение состоит в том, что на стандартный вывод выводится куча ошибок QPianter, по-видимому, из-за несуществующего индикатора:

QPainter::begin: Paint device returned engine == 0, type: 3

Чтобы избежать этого, я создал полностью прозрачное png-изображение размером 1x1 пиксель

"QRadioButton:indicator {width: 1px; height: 1px; image: url(:/img/empty.png)}"

Это работает так же хорошо, без генерации сообщений об ошибках QPainter.

Редактировать:

Как прокомментировал Максим Паперно, это также работает:

"QRadioButton:indicator {image: null}"
...