Я пытаюсь написать приложение на основе Qt, которое отображает и манипулирует изображениями.
Я хочу, чтобы изображение всегда увеличивалось до размера окна, сохраняя его соотношение сторон.
К сожалению, в QLabel нетвозможность сохранить соотношение сторон прикрепленного растрового изображения.
Итак, я написал собственный виджет и реализовал resizeEvent () и paintEvent (), чтобы изменить размер изображения
и нарисовать его:
class MyLabel : public QWidget
{
Q_Object
public:
MyLabel(): pixmap("test.tif") {}
protected:
void resizeEvent(QResizeEvent *event)
{
pixmap_scaled = pixmap.scaled(size(), Qt::KeepAspectRatio);
}
void paintEvent(QPaintEvent *event)
{
QPainter p(this);
p.drawPixmap(0, 0, pixmap_scaled);
p.end();
}
private:
QPixmap pixmap, pixmap_scaled;
};
Ноизменение размера изображения происходило не так гладко, как в QLabel.
Затем я смотрю на функцию paintEvent QLabel в qlabel.cpp, чтобы увидеть, как она отображает растровое изображение.
Там кажется, что растровое изображение - один разпреобразовал в QImage и масштабировал до размера окна,
, а затем снова преобразовал в QPixmap.
Я был немного удивлен, потому что преобразование между QPixmap и QImage - дорогостоящая операция
согласно справочному руководству Qt, ноЯ попытался переписать paintEvent () моего виджета, чтобы сделать то же самое
, что и QLabel :: paintEvent ().Затем изменение размера стало намного медленнее, чем ожидалось.
Интересно, почему изменение размера QLabel происходит так быстро?Является ли это преимуществом «неявного совместного использования данных»?
Конечно, невозможно просто скопировать paintEvent () из QLabel в мой класс, потому что недоступны частные данные
, такие как «указатель d».
Буду признателен за любую помощь.