Как преобразовать QIcon в QPixmap

У меня есть следующий код, и я должен изменить его с помощью кода Qt4.

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

для замены Qt3-кода на Qt4, я должен заменить pixmap() одним из следующих методов, предоставляемых 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

Так как я не знаю, какой размер или размер он использует в этом вызове pixmap(void). Поэтому мне нужно найти альтернативу, которая может устранить этот код, не задавая явно размер.

Что я понимаю из этого сегмента кода. Он принимает размер значка. Поэтому я пытаюсь выяснить размер значка. Но опять-таки я не нашел способа получить размер значка.

Ответ 1

QIcon может содержать несколько изображений разного размера, общий icon.pixmap() слишком произволен (какой размер будет использоваться для сборки QPixmap?). pixmap() метод по-прежнему доступен, но вы должны указать, какой размер вы хотите.

Если вы знаете размер, вы можете просто использовать:

QPixmap pixmap = icon.pixmap(requiredImageSize);

Если вы этого не сделаете (как в вашем случае), у вас есть альтернативы. Сначала вы можете запросить изображение с указанным размером (или меньше) с помощью метода QIcon::actualSize().

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

Suppsing icon содержит 16x16, 24x24 и 64x64, тогда он вернет 24x24 (наибольшее изображение меньше указанного вами).

Вторая альтернатива - выбрать самое большое доступное изображение (при условии, что ширина и высота всегда равны), запрашивая размеры с помощью 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));

Обратите внимание, что если вы используете первый метод и вы указываете значение, достаточно большое, вы получите тот же результат:

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

Конечно, вы также можете просто выбрать первый/последний доступный размер:

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

Ответ 2

Существует несколько методов, описанных в справочной документации QIcon. Например,

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

где вам нужно указать размер вашего желаемого результата.