QWidget paintEvent slow when rendering
-
wrote on 8 Nov 2017, 14:11 last edited by
I'm creating a kind of sidebar and so I created a class called
Sidebar
and inside thepaintEvent
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); }
-
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. -
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.wrote on 8 Nov 2017, 18:13 last edited by Dohisev 11 Aug 2017, 18:14@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 usingQPainter
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.
-
@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 usingQPainter
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.
@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? -
@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?wrote on 8 Nov 2017, 18:28 last edited by@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. -
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 youIs this when u start as debug or just run?
Does a default empty GUI app, with a few widgets also does this blink in ?
-
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 youIs this when u start as debug or just run?
Does a default empty GUI app, with a few widgets also does this blink in ?
wrote on 8 Nov 2017, 18:38 last edited by@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:
-
@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:
wrote on 9 Nov 2017, 07:10 last edited byAnyone 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); ... }
-
I would guess on first call to fontMetrics is expensive as it reads font info.
-
@Dohisev
mmh, have you tried calling the base paintEvent first?void Sidebar::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); QPainter painter(this); ... }
-
Lifetime Qt Championwrote on 9 Nov 2017, 13:15 last edited by mrjj 11 Sept 2017, 13:15
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.
-
wrote on 9 Nov 2017, 13:30 last edited byThis post is deleted!
-
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.
wrote on 9 Nov 2017, 13:56 last edited by Dohisev 11 Sept 2017, 14:00@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. -
@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.@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? -
@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?wrote on 9 Nov 2017, 16:12 last edited by@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. -
@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.@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?
-
wrote on 9 Nov 2017, 16:24 last edited by
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?
-
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?
Lifetime Qt Championwrote on 9 Nov 2017, 16:26 last edited by mrjj 11 Sept 2017, 16:27@Dohisev
Hi
It also have a small delay here. So maybe there is nothing wrong.
1/29