Qt Ikony za pomocą QPixmap

0

Używam poniższej funkcji do rysowania icon. Funkcja "zamienia" label na ikonę. Rysowanie działa poprawnie, tylko w konsoli po uruchomieniu dostaję taki komunikat:
QPainter: Painter not active
QPainter: Painter not active
QPainter: Painter not active
QPainter: Painter not active

Co jest tego przyczyną?

 void MainWindow::drawIcon(QLabel* label, const QPixmap& pix, const QString txt )
{
  label->setText("");

 QPainter p;

 int strWidth = p.fontMetrics().width( txt );
 int strHeight = p.fontMetrics().height();


 int pixWidth = pix.width();
 int pixHeight = pix.height();

 QPixmap res( qMax(strWidth, pixWidth), strHeight + pixHeight + 6 );
 res.fill(Qt::white);

 p.begin( &res );
 int start = 0;
 if ( pixWidth < strWidth )
 start = (strWidth-pixWidth)/2;

 p.drawPixmap( start ,0, pix );
 p.setFont(QFont("Helvetica", 12));
 p.drawText( QRect( 0,pixHeight, pixWidth, strHeight+6), Qt::AlignCenter, txt );
 p.end();

 label->setPixmap(res);
 label->setFixedSize(res.size());

}
 
1

Nie wiem co za dziwo robisz, ale to powinno być raczej tak (poprawione na głupa):

void MainWindow::drawIcon(QLabel* label, const QPixmap& pix, const QString txt )
{
    QFont myFont("Helvetica", 12);
    QFontMetrics metrics(myFont);
    int strWidth = metrics.width(txt);
    int strHeight = metrics.height();
    int pixWidth = pix.width();
    int pixHeight = pix.height();
 
    QPixmap res( qMax(strWidth, pixWidth), strHeight + pixHeight + 6 );
    res.fill(Qt::white);
    QPainter p(&res);
    int start = qMax((strWidth-pixWidth)/2, 0);
    p.drawPixmap( start ,0, pix );
    p.setFont(myFont);
    p.drawText( QRect( 0,pixHeight, pixWidth, strHeight+6), Qt::AlignCenter, txt );

    label->setPixmap(res);
    label->setFixedSize(res.size());
}

Prawidłowo zaprojektowane powinno to wyglądać tak (w sumie nawet nie powinno być to w MainWindow):

QPixmap MainWindow::mergePixmapAndText(const QPixmap& pix, const QString txt)

Albo tak:

void MainWindow::mergePixmapAndText(const QPixmap& pix, const QString txt) {
     ...
     emit pixmapWasMerged(pixmap);
}
0

@MarekR22 Dzięki za sugestię. Kod działa poprawnie. Modyfikacja label w funkcji jest złym pomysłem? Zrobiłem tak bo chciałem zamknąć wszystko w jednej funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1