QWidget paintEvent slow when rendering



  • I'm creating a kind of sidebar and so I created a class called Sidebar and inside the paintEvent I started drawing this to test how I'm going to be drawing the sidebar dynamically later, I tried to draw a kind of "button" but I noticed that it takes a while to render while loading the sidebar in the meantime it's all white.

    void Sidebar::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
    
        // paint the background
        painter.fillRect(rect(), QColor(100, 100, 100));
    
        // draw the sidebar button
        QRect buttonRect(0, 0, 80, 80);
        painter.fillRect(buttonRect, QColor(150, 150, 150));
    
        // draw the title
        QString title = "Welcome";
    
        QSize size = painter.fontMetrics().size(
            Qt::TextSingleLine, title
        );
    
        QRect textRect(
            QPoint(
                buttonRect.width() / 2 - size.width() / 2,
                buttonRect.bottom() - size.height() - 5
            ),
            size
        );
    
        painter.drawText(textRect, Qt::AlignCenter, title);
    }
    

  • Qt Champions 2017

    Hi
    That code do not seem to do a lot so if you see it as white my
    guess is that you use a loop and block the event queue while loading/do other stuff and
    it never get the change to call paintEvent before later.



  • @mrjj I'm not calling anything other than that. I have promoted that Sidebar widget to a widget that is in a layout and nothing more than that.

    I feel it kinda "lagging" when loading, it like freezes the gui for a few microseconds like everything is white like frozen and then it just blinks everything and appears.
    All the examples using QPainter doesn't have this problem when loading but I'm having.

    And just to be clear: I doesn't be white forever, it does work after, I'm saying that it freezes or something like that before appearing.


  • Qt Champions 2017

    @Dohisev
    What device are you running on ?

    So you just have a mainwindow and have a widget u promoted to
    Sidebar ?
    And side bar does not do anything beside the little drawing u have shown?



  • @mrjj I'm on Windows x64 bit, Qt 5.9.2, MSVC 2015, Intel i5.

    Noticed that it starts all white and then blinks everything on the screen? It's like freezing the gui until it paints.
    I removed a few parts from the code and I noticed that it happens when drawing the text.

    0_1510165653582_2017-11-08_15-25-03.gif


  • Qt Champions 2017

    Hi
    Ok, that should not lag at all.
    That is a bit odd as promotion is nothing
    fancy and basically, it does
    SideBar *var= new SideBar() for you

    Is this when u start as debug or just run?

    Does a default empty GUI app, with a few widgets also does this blink in ?



  • @mrjj That is actually a default gui with nothing more than this sidebar promoted to a widget and a QTableWidget.
    I don't know what is happening, as I said, if I remove the code to draw the text it doesn't blink.

    Precisely this part of the code:

    QString title = "Welcome";
    
    QSize size = painter.fontMetrics().size(
        Qt::TextSingleLine, title
    );
    

    If I comment that part of the code this is how it runs:

    0_1510166324835_2017-11-08_15-38-19.gif



  • Anyone to help me with that?



  • @Dohisev
    mmh, have you tried calling the base paintEvent first?

    void Sidebar::paintEvent(QPaintEvent *event)
    {
        QWidget::paintEvent(event);
    
        QPainter painter(this);
    
        ...
    }
    

  • Qt Champions 2017

    @Dohisev

    I would guess on first call to fontMetrics is expensive as it reads font info.



  • @J.Hilk It's still the same, unfortunately.
    @mrjj Do you have any idea of what I can do to solve this?


  • Qt Champions 2017

    @Dohisev

    Yes call fontMetrics outside the paint and calc size there to see if that works faster.
    make sur eto use same font both places :)

    QFont font("times", 24);
    QFontMetrics fm(font);
    int pixelsWide = fm.width("What's the width of this text?");
    

    Normally its not that slow. so u might have a broken ttf file or something.



  • This post is deleted!


  • @mrjj I tried this but it doesn't work. I'm even drawing icons on the sidebar and it's not freezing, but when I uncomment the draw text it does freeze.

    edit: It's not the font metrics, it's the drawText itself, I put only: painter.drawText(itemRect, Qt::AlignCenter, "welcome"); and it's freezing.


  • Qt Champions 2017

    @Dohisev
    I have not seen that before. Do you set a special font or something?
    Does any of the many samples do anything like that?
    Did you install extra fonts to windows?



  • @mrjj Yes, it doesn't happen with all examples on Qt using QPainter but probably does happen when using to draw a text. Yes, I have installed fonts on Windows but how does that changes anything? No, I'm not using a font to draw, I'm just calling to draw a text and that is it.


  • Qt Champions 2017

    @Dohisev
    Qt will enumerate all fonts. So if some of the ttf files are bad, it can hang a bit in that.
    On a desktop class system, normally its shown instantly so
    the reason that drawText is slow must be found somewhere else.

    How high resolution are you running?



  • What you mean with the resolution? You mean my screen resolution? It's 1366x768.

    Is there a workaround to check if it's a problem with the enumeration Qt does with the fonts?


  • Qt Champions 2017

    @Dohisev
    Hi
    It also have a small delay here. So maybe there is nothing wrong.
    alt text



  • @mrjj I really can't notice the delay on yours, on mine it's like way too much.

    https://ddgobkiprc33d.cloudfront.net/57399f19-427b-4f7f-b48b-064649ae1a22.gif

    Focus on the mouse cursor and see that it appears a loading cursor while it's all white.


  • Qt Champions 2017

    Yeah your first paint for mainwindow seems much slower.

    But i dont get it if none of the other samples do anything like that as they are have same structure etc.

    Can you try my test project?
    https://www.dropbox.com/s/nl0issoplwylkb7/slowtext.zip?dl=0

    Just to verify that it runs slower at your pc. Then it must be local somehow.,



  • @mrjj It seems to be a local problem, I don't know if this will be happening if I compile here and distribute the generated binary. What should I do?

    0_1510246550049_2017-11-09_13-54-10.gif


  • Qt Champions 2017

    @Dohisev
    First i would update video drivers. just to be on the safe side.
    Im pretty sure it wont happen when you distribute your app but
    it would be nice to know what it comes from.

    If you remove the drawText , the speed is normal ?



  • @mrjj Yes, it's only slow when drawing the texts, If I draw only shapes it doesn't lag.


  • Qt Champions 2017

    @Dohisev
    You could try remove some of the new fonts from the font folder and see.



  • @mrjj I did remove all the fonts I installed but it's still the same, so I'm going to be updating the drivers and hope that everything is back to normal after that, if not, I think it might be something with my computer. It might be needing a clean up or something like that.
    Thank you mrjj, you helped a lot, thank you for your patience.


  • Qt Champions 2017

    @Dohisev
    You are most welcome.
    It is a bit of odd case and updating gfx drivers is a good idea.
    Its clearly related to drawText but i think its something deeper that Qt.



  • @mrjj I'm here to say that I made a HUGE clean up on my computer and it's not lagging anymore when rendering.


  • Qt Champions 2017

    @Dohisev
    Ah. so it was good old lag :)
    Well thx for reporting back.
    So it might have been some dll conflict or similar issue and you clean it out. \o/


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.