Qt 是否可以为QRADIO按钮使用自定义可缩放图像?

Qt 是否可以为QRADIO按钮使用自定义可缩放图像?,qt,qtstylesheets,qradiobutton,Qt,Qtstylesheets,Qradiobutton,使用一个简单的QPushButton,如果我想使用自定义图像,而按钮的大小由布局决定(因此可以自由缩放),唯一的可能是覆盖样式表中的边框图像。如果将图像添加为图像属性而不是边框图像,则图像不会缩小 但是,如果我使用QRADIO按钮并覆盖图像或边框图像,单选按钮的圆圈将保持可见。我找不到隐藏或覆盖它的方法 一种可能是忽略标签,并更改圆圈图标本身。这可以通过覆盖QRadioButton:indicator来实现,但是,它不接受边框图像,它只接受不会缩放的图像 有没有办法解决这个问题,或者我一直坚持使

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

但是,如果我使用QRADIO按钮并覆盖
图像
边框图像
,单选按钮的圆圈将保持可见。我找不到隐藏或覆盖它的方法

一种可能是忽略标签,并更改圆圈图标本身。这可以通过覆盖
QRadioButton:indicator
来实现,但是,它不接受
边框图像
,它只接受不会缩放的
图像

有没有办法解决这个问题,或者我一直坚持使用QPushButton with
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()}"
);
QPainter::begin: Paint device returned engine == 0, type: 3

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

将指示器的大小减小到零似乎可行。它仍然是一个丑陋的黑客(作为按钮和标签的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错误被打印到标准输出,这似乎是因为不存在指示符:

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()}"
);
QPainter::begin: Paint device returned engine == 0, type: 3
为了避免这种情况,我创建了一个1x1像素的完全透明png图像

"QRadioButton:indicator {width: 1px; height: 1px; image: url(:/img/empty.png)}"
这同样有效,不会生成QPaint错误消息

编辑:

正如Maxim Paperno所评论的,这也适用于:

"QRadioButton:indicator {image: null}"
你说的“缩放”是什么意思<代码>图像和
边框图像
(和
背景
图像)具有不同的用例。任何SVG图像都是平滑可伸缩的,而光栅图像则不是。“自定义图像”对于按钮意味着什么。。。你是说图标吗?单选按钮图标带有
::指示器
子控件,与任何按钮一样,图像应“缩放”以适应当前
图标的大小
属性。另外,使用
image:null
以去除图标,而不是空白URL(如您所见,这会导致画师警告)。