c++qtqt4qt3

How to convert QIcon to QPixmap


I have following code and I have to change it with Qt4 code.

QIcon icon;
QPixmap pixmap = icon.pixmap();    // Qt3 code

for replacing Qt3 code with Qt4, I have to replace pixmap() with one of following methods provided by the Qt4.

QPixmap QIcon::pixmap ( const QSize & size, Mode mode = Normal, State state = Off ) const  
QPixmap QIcon::pixmap ( int w, int h, Mode mode = Normal, State state = Off ) const
QPixmap QIcon::pixmap ( int extent, Mode mode = Normal, State state = Off ) const

Since I don't know what size or dimension it is using in this call of pixmap(void). So I need to find out alternative which can eliminate this code without asking explicitly size.

What I understand from this code segment. It is taking size of icon. So I try to find out size of icon. But again I do not find any method to get size of icon.


Solution

  • QIcon may contain multiple images with different sizes, a generic icon.pixmap() is too much arbitrary (which size will be used to build QPixmap?). pixmap() method is still available but you have to specify which size you want.

    If you know size then you can simply use:

    QPixmap pixmap = icon.pixmap(requiredImageSize);
    

    If you don't (as in your case) then you have some alternatives. First you may ask for an image with a specified size (or less) using QIcon::actualSize() method.

    QPixmap pixmap = icon.pixmap(icon.actualSize(QSize(32, 32)));
    

    Suppsing icon contains 16x16, 24x24 and 64x64 then it'll return 24x24 (biggest image smaller than what you specified).

    Second alternative is to pick biggest available image (assuming width and height are always equal) querying sizes using QIcon::availableSizes():

    QList<QSize> sizes = icon.availableSizes();
    int maximum = sizes[0].width();
    for (int i=1; i < sizes.size(); ++i)
        maximum = qMax(maximum, sizes[i].width());
    
    QPixmap pixmap = icon.pixmap(QSize(maximum, maximum));
    

    Note that if you use first method and you specify a value big enough then you'll have same result:

    QPixmap pixmap = icon.pixmap(icon.actualSize(QSize(1024, 1024)));
    

    Of course you may also simply pick first/last available size:

    QPixmap pixmap = icon.pixmap(icon.availableSizes().first());
    QPixmap pixmap = icon.pixmap(icon.availableSizes().last());