2015-10-03 3 views
2

Как изменить непрозрачность QPixmap?Qt- Изменить непрозрачность QPixmap

я установить изображение в качестве фона на самом деле я хочу, чтобы изменить его непрозрачности, Вот мой код:

Call.h:

private: 
    QPixmap m_avatar; 

Call.cpp:

void Call::resizeEvent(QResizeEvent *e) 
{ 
    QPalette pal = palette(); 
    pal.setBrush(backgroundRole(), m_avatar.scaled(e->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); 
    setPalette(pal); 
} 

Я изменил resizeEvent функция, bu t он не изменяет непрозрачность фона.

void Call::resizeEvent(QResizeEvent *e) 
{ 
    QPixmap result_avatar(m_avatar.size()); 
    result_avatar.fill(Qt::transparent); 
    QPainter painter; 
    painter.setOpacity(0.5); 
    painter.begin(&result_avatar); 
    painter.drawPixmap(0, 0, m_avatar); 
    painter.end(); 
    QPalette pal = palette(); 
    pal.setBrush(backgroundRole(), result_avatar.scaled(e->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); 
    setPalette(pal); 
} 

Любое предложение?

+0

Какой ОС вы используете? – dtech

+0

Windows @ddriver – AFN

+0

Какая из многих версий поддерживается Qt? – dtech

ответ

1

Вы не используете локальный QPainter объект. По QWidget Events:

paintEvent() вызывается всякий раз, когда виджет должен быть перекрашен. Каждый виджет, отображающий пользовательский контент, должен его реализовать. Картина с использованием QPainter может иметь место только в paintEvent() или в функции , вызываемой paintEvent().

Здесь работает:

void Call::paintEvent(QPaintEvent *) 
{ 
    // create a new object scaled to widget size 
    QPixmap result_avatar = m_avatar.scaled(size()); 

    QPainter painter(this); 
    painter.setOpacity(0.5); 
    // use scaled image or if needed not scaled m_avatar 
    painter.drawPixmap(0, 0, result_avatar); 
} 

Обновления для рисования на пиксельные картах случае

Если она необходима только краску с некоторой непрозрачностью на пиксельном с помощью QPainter, в непрозрачность должна быть установлена ​​только после активации QPainter по QPainter::begin(). Таким образом, после изменения порядка Растровое изображение result_avatar имеет два изображения (один изменен с непрозрачностью 1 и оригинальной пиксельной на вершине с непрозрачностью 0.5):

QPainter painter; 
painter.begin(&result_avatar); 
painter.setOpacity(0.5); 
painter.drawPixmap(0, 0, m_avatar); 
painter.end() 
+0

Это стоит только при рисовании на виджет, он рисует на pixmap, вы можете рисовать на pixmap откуда угодно. – dtech

+0

Автор пытается установить палитру в виджет с размером пиксельной карты, измененной до размера виджета. Ключ в этом вопросе - «установить образ как фон на самом деле». –

+0

Я думаю, что «на самом деле» на самом деле является частью «на самом деле я хочу изменить его непрозрачность». Он не рисует виджет за пределами своего события рисования, он устанавливает палитру, я логически предполагаю, что установка палитры вызовет событие рисования по умолчанию. НЕТ НИЧЕГО, что документ, который говорит, что палитру нужно установить в методе события рисования. – dtech

Смежные вопросы