c++qtqtstylesheetsqpainterqscrollarea

How to set QPdfView's viewport background color


I'm trying to set a QPdfView's viewport background color, but unlike QAbstractScrollArea (from which QPdfView's derived), using stylesheet does not work.

Here's how I tried to do that:

#include <QApplication>
#include <QPdfView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPdfView *pdfView = new QPdfView();

    pdfView->setMinimumSize(100,100);
    //I tried to set stylesheet in different ways, in multiple combinations
    //but none worked
    //pdfView->setStyleSheet("background: white");
    pdfView->setStyleSheet("QWidget{background: white;}");
    //pdfView->viewport()->setStyleSheet("background: white");

    pdfView->show();

    return a.exec();
}

Note: You need to to find and target PdfWidgets, so modify your CMakeLists.txt according the below, to be able to use QPdfView:

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets PdfWidgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets PdfWidgets)

target_link_libraries(MyExperiments PRIVATE
     Qt${QT_VERSION_MAJOR}::Widgets
     Qt${QT_VERSION_MAJOR}::PdfWidgets)

Here's how it looks, viewport is grey, and you can see the white background of QPdfView on the borders:

PdfView with stylesheet

I also tried to change the background color of viewport by overriding QAbstractScrollArea::paintEvent, and here's how:

void paintEvent(QPaintEvent *event)
{
    QPdfView::paintEvent(event);

    QPainter p(viewport());
    QRect rect = viewport()->rect();

    rect.adjust(-1,-1,0,0);
    p.setBrush(QBrush(QColor(0,0,100)));
    p.drawRect(rect);
}    

But that ended up painting over viewport, not changing its background color, so it covers open documents, because If I use a transparent color, I can see the document through it.

I'm open to either or other ways, but I'd like to avoid using paintEvent if possible.


Solution

  • If you look at QPdfView's source code of paintEvent, you'll notice QPalette::Dark being used to fill viewport, and based on that, you can change its background color without obscuring open documents as follows:

    #include <QApplication>
    #include <QPdfView>
    #include <QPalette>
    
    int main(int argc, char **argv) 
    {
        QApplication app(argc, argv);
        
        QPdfView view;
        
        QPalette palette = view.palette();
        palette.setBrush(QPalette::Dark, QColor("lime"));
        
        view.setPalette(palette);    
        view.show();
        
        return app.exec();
    }
    

    QPdfView viewport with lime background color

    Note: QPalette::Dark needs to be used, changes to painting the viewport will only occur if made through it.

    Source: Qt Forum How to set QPdfView's viewport background color?

    Credit: ChrisW67