1

使用简单的 QPushButton,如果我想使用自定义图像,而按钮的大小由布局确定(因此可以自由缩放),唯一的可能性是border-image在样式表中覆盖。如果我将图像添加为image属性而不是border-image,则图像不会按比例缩小。

但是,如果我使用 QRadioButton 并覆盖imageor 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()}"
);

问题是,虽然圆圈现在不可见,但它仍然占用空间,因此图像不会填满整个可用空间。

4

1 回答 1

1

将指标的大小减小到零似乎有效。它仍然是一个丑陋的 hack(因为 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

为了避免这种情况,我创建了一个 1x1 像素完全透明的 png 图像

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

这同样有效,不会生成 QPainter 错误消息。

编辑:

正如 Maxim Paperno 评论的那样,这也有效:

"QRadioButton:indicator {image: null}"
于 2020-01-10T06:44:34.067 回答