显示图像的透明按钮

时间:2016-02-04 20:45:07

标签: android c++ qt

我想创建一个按钮,显示具有透明背景的给定图像。我正在使用以下代码段:

ui->setupUi(this);
this->setFixedSize(width, height);

QPixmap* orgPixmap = new QPixmap(":/images/a.png");
QSize size(this->width(), this->height());
QPixmap resizePixmap(orgPixmap->scaled(size));

QPalette palette;
palette.setBrush(this->backgroundRole(), QBrush(resizePixmap));
this->setPalette(palette);

ui->toolButton->setStyleSheet("background-color: rgba(255, 255, 255, 0);");
ui->toolButton->setFixedSize(64, 64);
ui->toolButton->setIconSize(QSize(64, 64));
ui->toolButton->setIcon( QIcon(":/images/add.png") );

在小部件的顶部,我添加了一个带图标的按钮。这是一个透明背景的蓝色圆圈。但是,当我在Android设备上部署并运行我的代码时,按钮会显示为带有白色的不透明背景。

请看图片:

enter image description here

我尝试使用以下代码强制按钮的透明度:

QColor transparent_color(0,0,0,0);
QPalette button_palette(ui->pushButton->palette());

button_palette.setColor(QPalette::Button, transparent_color);
ui->toolButton->setPalette(button_palette);

上面的代码似乎没有达到我预期的效果。 我想知道问题可能是什么以及如何解决它。

3 个答案:

答案 0 :(得分:0)

我看到你需要一个圆形按钮,那么QWidget::setMask()怎么样?

QPainterPath path;
path.addEllipse(ui->pushButton->rect());
QRegion mask = QRegion(path.toFillPolygon().toPolygon());
ui->pushButton->setMask(mask);

只是一个想法,我没有测试过。

答案 1 :(得分:0)

您可以设置简单的样式表。如下所示:widget->setStyleSheet(rgba(255, 255, 255,0);");如果要调整不透明度,只需更改第四个参数即可。

答案 2 :(得分:0)

我已经在基于Qt Graphics View Framework的Win / Mac项目上接受了类似的问题,请注意我从来没有在Android平台上测试过这个问题。

无论如何,首先你需要为你的图形场景设置setForegroundBrush():

ui.yourGraphicsView->scene()->setsetForegroundBrush(Qt::transparent);

或者,您可以使用Qt Designer获取类似的结果或编辑Project.ui文件,如下所示:

<widget class="QGraphicsView" name="yourGraphicsView">
...
 <property name="foregroundBrush">
  <brush brushstyle="NoBrush">
   <color alpha="255">
    <red>0</red>
    <green>0</green>
    <blue>0</blue>
   </color>
  </brush>
 </property>

现在setBackgroundBrush()对你的按钮是透明的:

ui->toolButton->setBackgroundBrush(Qt::transparent);

我发现这两个足以将透明按钮悬停在QGraphicScene中的其他对象上;调用setMask()不是必需的,因为当QtraphicsPixmapItem(或祖先)设置为alpha通道的PNG时,Qt会自动调用它。对于按钮,它也可以按预期工作:单击PNG的透明区域(上面显示的白色)不会触发OnClick()事件,而单击基于PNG的按钮上的透光部分则会。

希望这会有所帮助......

相关问题