app using "excessive" CPU
-
@mrjj you understand it perfectly, and "odd" is a mild term for it.
I seriously don't know what to look at here. I'm afraid that the profiler we run tomorrow won't show anything in my code space.
@mzimmers said in app using "excessive" CPU:
I'm afraid that the profiler we run tomorrow won't show anything in my code space.
Always with the negative waves https://www.youtube.com/watch?v=KuStsFW4EmQ Have a little faith, baby!
-
Well, my associate hasn't yet built the app on Linux, but I discovered the source (if not the cause) of the problem: my logo.
I have a small (201x59 pixel) PNG in the upper left of my widget. When I remove it from my .qrc file, the CPU usage disappears.
Any ideas on this one?
-
I suspect it has something to do with this line:
painter.drawPixmap(rect(), pixmap()->scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));I don't need to scale it; what do I replace the call to scaled() with?
@mzimmers said in app using "excessive" CPU:
painter.drawPixmap(rect(), pixmap()->scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
painter.drawPixmap(rect(), pixmap()); actaully scale it to rect so @Bonnie version is correct.to draw it at original size.
or you can simply scale it once outside paintEvent and reuse the scaled version.
-
I suspect it has something to do with this line:
painter.drawPixmap(rect(), pixmap()->scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));I don't need to scale it; what do I replace the call to scaled() with?
-
Thank you all for the replies. I tried mrjj's/Bonnie's suggestions, and they didn't change the CPU usage.
But really, the question (IMO) is WHY is my logo being wiggled? I have matched the dimensions of the .png file to the QWidget (a QLabel) that displays it. I've set the QLabel's size to fixed. What could be causing this flood of paint events?
The technique I'm using is to promote the QLabel to a class I've created (LogoLabel). Here's the entirety of its paint event:
void LogoLabel::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter painter(this); const QString filename(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png"); bool rc; rc = m_pixmap.load(filename); if (rc) { setPixmap(m_pixmap); Qt::KeepAspectRatio, Qt::SmoothTransformation)); painter.drawPixmap(0, 0, *pixmap()); } } -
Thank you all for the replies. I tried mrjj's/Bonnie's suggestions, and they didn't change the CPU usage.
But really, the question (IMO) is WHY is my logo being wiggled? I have matched the dimensions of the .png file to the QWidget (a QLabel) that displays it. I've set the QLabel's size to fixed. What could be causing this flood of paint events?
The technique I'm using is to promote the QLabel to a class I've created (LogoLabel). Here's the entirety of its paint event:
void LogoLabel::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QPainter painter(this); const QString filename(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png"); bool rc; rc = m_pixmap.load(filename); if (rc) { setPixmap(m_pixmap); Qt::KeepAspectRatio, Qt::SmoothTransformation)); painter.drawPixmap(0, 0, *pixmap()); } }@mzimmers Why are you doing the loading in the paintEvent???
void LogoLabel::paintEvent(QPaintEvent *event) { Q_UNUSED(event) //m_pixmap should already be loaded if (!m_pixmap.isNull()) { QPainter painter(this); painter.drawPixmap(0, 0, m_pixmap); } }I remembered you had a post said you write your label class because you want the QLabel to scale smoother.
Now, if you do not need to scale, you only need to load the pixmap once after it is created.label.setPixmap(QPixmap(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png"));If you still need to scale, I think you should scale it in the resizeEvent.
void LogoLabel::resizeEvent(QResize*event) { QLabel::resizeEvent(event); if(QPixmap *pix = pixmap()) m_pixmap = pix->scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); }Actually, I don't think you need to subclass QLabel...Subclassing QWidget is enough if you reimplement all these events...
-
@mzimmers Why are you doing the loading in the paintEvent???
void LogoLabel::paintEvent(QPaintEvent *event) { Q_UNUSED(event) //m_pixmap should already be loaded if (!m_pixmap.isNull()) { QPainter painter(this); painter.drawPixmap(0, 0, m_pixmap); } }I remembered you had a post said you write your label class because you want the QLabel to scale smoother.
Now, if you do not need to scale, you only need to load the pixmap once after it is created.label.setPixmap(QPixmap(":/logos/CYBERDATA_IP_ENDPOINT_CO_small.png"));If you still need to scale, I think you should scale it in the resizeEvent.
void LogoLabel::resizeEvent(QResize*event) { QLabel::resizeEvent(event); if(QPixmap *pix = pixmap()) m_pixmap = pix->scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); }Actually, I don't think you need to subclass QLabel...Subclassing QWidget is enough if you reimplement all these events...
@Bonnie you nailed it. I moved the load to the c'tor, and everything works much better now.
A couple of notes:
- I turned on my event filter, and it's no longer spewing zillions of events, so I guess my keyPress idea would have worked (if Windows wasn't so lame).
- I tried making my painter a member variable and initializing it in the c'tor, but that didn't work. Any idea why?
Thanks to everyone who looked at this.
-
@Bonnie you nailed it. I moved the load to the c'tor, and everything works much better now.
A couple of notes:
- I turned on my event filter, and it's no longer spewing zillions of events, so I guess my keyPress idea would have worked (if Windows wasn't so lame).
- I tried making my painter a member variable and initializing it in the c'tor, but that didn't work. Any idea why?
Thanks to everyone who looked at this.
-
@Bonnie you nailed it. I moved the load to the c'tor, and everything works much better now.
A couple of notes:
- I turned on my event filter, and it's no longer spewing zillions of events, so I guess my keyPress idea would have worked (if Windows wasn't so lame).
- I tried making my painter a member variable and initializing it in the c'tor, but that didn't work. Any idea why?
Thanks to everyone who looked at this.
@mzimmers To add to @Bonnie it is actually explained in the documentation https://doc.qt.io/qt-5/qpainter.html :
"Warning: When the paintdevice is a widget, QPainter can only be used inside a paintEvent() function or in a function called by paintEvent()."