我需要更改我所拥有的QImage的alpha值,以便它与其他QImages融合在一起。这需要快速打开和关闭。
以前我不得不重新创建每一个图像并为它们提供具有不同alpha值的新颜色。但现在我想保留相同的原始图像,而不是重绘和绘制它。
我现在正试着这样做:
QImage image;
unsigned int rgb;
for(int y=0;y<image.height();y++){
for(int x=0;x<image.width();x++){
rgb=image.pixel(x,y);
image.setPixel(x,y,qRgba(qRed(rgb),qGreen(rgb),qRed(rgb),120));
}
}
我得到了一些相当不可预测的行为。当我切换图像时,有时我会丢失颜色或不改变alpha。如果我切换回来时确实改变了alpha(我将alpha 255硬编码到其他地方而不是120),它就不会恢复正常。
这似乎不是正确的方法,不应该这么困难。看起来在图像上应该有一个函数调用来改变alpha,但我还没有找到它。
答案 0 :(得分:1)
如果您使用QImage
或其他QGraphicsView
中的QWidget
,则应查看此QGraphicsEffect
:
http://qt-project.org/doc/qt-4.8/qgraphicsopacityeffect.html
http://doc-snapshot.qt-project.org/4.8/qwidget.html#setGraphicsEffect
http://doc-snapshot.qt-project.org/4.8/qgraphicsitem.html#setGraphicsEffect
如果您使用的是QLabel,我会试试这个:
#include <QLabel>
#include <QPainter>
class TransparentQLabel : public QLabel
{
Q_OBJECT
public:
explicit TransparentQLabel() : QLabel() {}
~TransparentQLabel(){}
void setOpacity(const qreal & val)
{
if (this->pixmap() == null || this->pixmap().isNull())
return;
QPixmap result(this->pixmap()->size());
result.fill(Qt::transparent);
QPainter painter;
painter.begin(&result);
painter.setOpacity(val);
painter.drawPixmap(0, 0, *(this->pixmap()));
painter.end();
QLabel::setPixmap(result);
}
};
下一位与你的问题只有一点点关系,但很高兴知道。如果您在QApplication
之外进行操作系统分层,则需要执行以下操作:
this->setWindowFlags( Qt::WindowStaysOnTopHint |
Qt::FramelessWindowHint | Qt::Tool);
this->setAttribute(Qt::WA_TranslucentBackground, true);
this->setAttribute (Qt::WA_TransparentForMouseEvents, true);
以下是这个问题的一个例子:
http://qt-project.org/wiki/QSplashScreen-Replacement-for-Semitransparent-Images
希望有所帮助。