2015-03-19 3 views
0

Я пытаюсь создать цветной ключ для qwebview в Qt5. Это означает, что я должен сделать прозрачный цвет прозрачным (другие виджеты должны быть видны через пиксели веб-просмотра с этим цветом). Я обнаружил, что это можно сделать с помощью операций QPainter :: CompositionMode, но не может заставить его работать.Создание ключа цветности для qwebview в Qt5

Например, мне нужно сделать все черные пиксели веб-представления прозрачными (исходный цвет должен быть изменен во время выполнения).

Я переписана QWebView :: paintEvent в моем классе (получить часть кода из источников Qt), но не знаю, что делать дальше

WebView::paintEvent(QPaintEvent *event) { 
    if (!page()) return; 
    QWebFrame *frame = page()->mainFrame(); 
    QPainter painter(this); 
    painter.setRenderHints(renderHints()); 
    painter.setCompositionMode(QPainter::CompositionMode_SourceOver); 
    frame->render(&painter, event->region()); 

}

Я нашел способ, как сделать любой цвет источника белого цвета с помощью следующего кода:

QWebFrame *frame = page()->mainFrame(); 
QImage source_image(size(), QImage::Format_ARGB32_Premultiplied); 
QImage result_image(size(), QImage::Format_ARGB32_Premultiplied); 

QPainter imagePainter(&source_image); 
imagePainter.setRenderHints(renderHints()); 
frame->render(&imagePainter, event->region()); 
imagePainter.end(); 

QImage mask = source_image.createMaskFromColor(qRgb(0x00,0x00,0x00)); // Source color 

QPainter resultPainter(&result_image); 
resultPainter.drawImage(source_image.rect(), source_image); 
resultPainter.setCompositionMode(QPainter::CompositionMode_Screen); 
resultPainter.drawImage(source_image.rect(), mask); 

QPainter painter(this); 
painter.setCompositionMode(QPainter::CompositionMode_SourceOver); 
painter.drawImage(0, 0, result_image); 

Но я не знаю, как преобразовать белый цвет прозрачный.

ответ

0

Я нашел решение, но оно потребляет много процессора.

Сначала это необходимо, чтобы установить

setStyleSheet("QWebView { background: transparent }"); 
setAttribute(Qt::WA_OpaquePaintEvent, true); 

где-то в конструкторе WebView (в я просто забыл упомянуть, что в первом сообщении). Тогда переописать paintEvent:

void WebView::paintEvent(QPaintEvent *event) 
{ 
    if (!page()) 
     return; 

    QWebFrame *frame = page()->mainFrame(); 
    QPainter painter(this); 
    QColor chroma_color(0, 0, 0); // A color that should be transparent 
    float opacity_level = 0.9; // WebView opacity 

    m_render_pixmap.fill(Qt::transparent); 

    QPainter pixmapPainter(&m_render_pixmap); 
    pixmapPainter.setRenderHints(renderHints()); 
    frame->render(&pixmapPainter, event->region()); 
    pixmapPainter.end(); 
    m_render_pixmap.setMask(m_render_pixmap.createMaskFromColor(
     chroma_color, Qt::MaskInColor)); 

    painter.setCompositionMode(QPainter::CompositionMode_SourceOver); 
    painter.setOpacity(opacity_level); 
    painter.drawPixmap(QPoint(event->rect().left(), event->rect().top()), m_render_pixmap, event->rect()); 
    painter.end(); 
} 

m_render_pixmap является экземпляром QPixmap. Я не хочу воссоздавать его каждый раз, когда вызывается paintEvent. Я просто воссоздать его на resizeEvent

void WebView::resizeEvent(QResizeEvent *event) 
{ 
    QWebView::resizeEvent(event); 
    m_render_pixmap = QPixmap(size()); 
} 

Код выше работы большой, но в моем случае я хочу сделать видео виджет ниже в WebView. Таким образом, WebView :: paintEvent вызывает около 25 раз в секунду, и каждый вызов занимает около 20-25 мс в оконном режиме на моем ПК. И он занимает около 100% одного из ядер процессора в полноэкранном режиме.