Russian Qt Forum

Qt => Вопросы новичков => Тема начата: NickSin от Октябрь 23, 2014, 17:49



Название: Qlabel и QPixmap
Отправлено: NickSin от Октябрь 23, 2014, 17:49
Имеется QLabel, в который вписан qpixmap, являющейся, в свою очередь, qimage.
Мне нужно, чтоб с изменением размера QLabel'a  ресайзилось бы и изображение.

Скажите, в каком направлении "копать"?


Название: Re: Qlabel и QPixmap
Отправлено: Old от Октябрь 23, 2014, 17:55
Скажите, в каком направлении "копать"?
В документацию?

Вот это не помогает?
void QLabel::setScaledContents(bool)


Название: Re: Qlabel и QPixmap
Отправлено: NickSin от Октябрь 24, 2014, 10:30
Скажите, в каком направлении "копать"?
В документацию?

Вот это не помогает?
void QLabel::setScaledContents(bool)

Странность в том, что это помогает мне в Windows версии, но в версиях на Unix'ах (Mac и Ubuntu) это не работает. Интересно, как такое может быть, если по сути, эти 3 класса не зависят от реализации ОС.


Название: Re: Qlabel и QPixmap
Отправлено: chagovets от Октябрь 24, 2014, 14:02
http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt (http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt)


Название: Re: Qlabel и QPixmap
Отправлено: NickSin от Октябрь 26, 2014, 14:18
http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt (http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt)

Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.


Название: Re: Qlabel и QPixmap
Отправлено: chagovets от Октябрь 26, 2014, 19:30
setScaledContents() и есть самое простое


Название: Re: Qlabel и QPixmap
Отправлено: Kurles от Октябрь 26, 2014, 20:36
http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt (http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt)

Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение QLabel, то переопределять класс всё равно придется. Вот еще один пример:
Код
C++ (Qt)
#ifndef SCALEDIMAGE_H
#define SCALEDIMAGE_H
 
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
 
class ScaledImage : public QWidget {
   Q_OBJECT
public:
   ScaledImage(QWidget *parent = 0) : QWidget(parent), mKeepAspectRatio(true) {}
 
protected:
   void paintEvent(QPaintEvent *e) {
       if (!mPixmap.isNull()) {
           QPainter p(this);
           if (mKeepAspectRatio){
               QPointF delta(e->rect().width() / (double)mPixmap.size().width(),
                             e->rect().height() / (double)mPixmap.size().height());
               QSize size;
               if (delta.x() < delta.y()) {
                   size.setWidth(delta.x() * mPixmap.size().width());
                   size.setHeight(delta.x() * mPixmap.size().height());
               } else {
                   size.setWidth(delta.y() * mPixmap.size().width());
                   size.setHeight(delta.y() * mPixmap.size().height());
               }
               QPoint topLeft((e->rect().size().width() - size.width()) / 2,
                              (e->rect().size().height() - size.height()) / 2);
               p.drawPixmap(QRect(topLeft, size), mPixmap, mPixmap.rect());
           } else {
               p.drawPixmap(e->rect(), mPixmap, mPixmap.rect());
           }
       }
   }
 
public slots:
   void setPixmap(const QPixmap &pixmap) {
       mPixmap = pixmap;
       update();
   }
 
   void setKeepAspectRatio(const bool value) {
       mKeepAspectRatio = value;
   }
 
   bool keepAspectRatio() const {
       return mKeepAspectRatio;
   }
 
private:
   QPixmap mPixmap;
   bool mKeepAspectRatio;
};
 
#endif // SCALEDIMAGE_H
 
Собственно кода то мало совсем.


Название: Re: Qlabel и QPixmap
Отправлено: NickSin от Октябрь 28, 2014, 11:34
http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt (http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt)

Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение QLabel, то переопределять класс всё равно придется. Вот еще один пример:
Код
C++ (Qt)
#ifndef SCALEDIMAGE_H
#define SCALEDIMAGE_H
 
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
 
class ScaledImage : public QWidget {
   Q_OBJECT
public:
   ScaledImage(QWidget *parent = 0) : QWidget(parent), mKeepAspectRatio(true) {}
 
protected:
   void paintEvent(QPaintEvent *e) {
       if (!mPixmap.isNull()) {
           QPainter p(this);
           if (mKeepAspectRatio){
               QPointF delta(e->rect().width() / (double)mPixmap.size().width(),
                             e->rect().height() / (double)mPixmap.size().height());
               QSize size;
               if (delta.x() < delta.y()) {
                   size.setWidth(delta.x() * mPixmap.size().width());
                   size.setHeight(delta.x() * mPixmap.size().height());
               } else {
                   size.setWidth(delta.y() * mPixmap.size().width());
                   size.setHeight(delta.y() * mPixmap.size().height());
               }
               QPoint topLeft((e->rect().size().width() - size.width()) / 2,
                              (e->rect().size().height() - size.height()) / 2);
               p.drawPixmap(QRect(topLeft, size), mPixmap, mPixmap.rect());
           } else {
               p.drawPixmap(e->rect(), mPixmap, mPixmap.rect());
           }
       }
   }
 
public slots:
   void setPixmap(const QPixmap &pixmap) {
       mPixmap = pixmap;
       update();
   }
 
   void setKeepAspectRatio(const bool value) {
       mKeepAspectRatio = value;
   }
 
   bool keepAspectRatio() const {
       return mKeepAspectRatio;
   }
 
private:
   QPixmap mPixmap;
   bool mKeepAspectRatio;
};
 
#endif // SCALEDIMAGE_H
 
Собственно кода то мало совсем.

Да, но честно кода больше, чем я сделал. Я просто переопределил у себя метод отрисовки, беру размер объекта и ресайзю,  так много исхитрений как ты не делаю - все работает)

Всем спасибо за помощь, вопрос решен)


Название: Re: Qlabel и QPixmap
Отправлено: GreatSnake от Октябрь 28, 2014, 12:46
Для справки.
Использовать QPixmap для масштабирования очень дорого и неэффективно, т.к. оный хранится на стороне граф.системы и предназначен для хранения статических картинок.


Название: Re: Qlabel и QPixmap
Отправлено: Kurles от Октябрь 28, 2014, 14:56
http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt (http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt)

Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение QLabel, то переопределять класс всё равно придется. Вот еще один пример:
Код
C++ (Qt)
#ifndef SCALEDIMAGE_H
#define SCALEDIMAGE_H
 
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
 
class ScaledImage : public QWidget {
   Q_OBJECT
public:
   ScaledImage(QWidget *parent = 0) : QWidget(parent), mKeepAspectRatio(true) {}
 
protected:
   void paintEvent(QPaintEvent *e) {
       if (!mPixmap.isNull()) {
           QPainter p(this);
           if (mKeepAspectRatio){
               QPointF delta(e->rect().width() / (double)mPixmap.size().width(),
                             e->rect().height() / (double)mPixmap.size().height());
               QSize size;
               if (delta.x() < delta.y()) {
                   size.setWidth(delta.x() * mPixmap.size().width());
                   size.setHeight(delta.x() * mPixmap.size().height());
               } else {
                   size.setWidth(delta.y() * mPixmap.size().width());
                   size.setHeight(delta.y() * mPixmap.size().height());
               }
               QPoint topLeft((e->rect().size().width() - size.width()) / 2,
                              (e->rect().size().height() - size.height()) / 2);
               p.drawPixmap(QRect(topLeft, size), mPixmap, mPixmap.rect());
           } else {
               p.drawPixmap(e->rect(), mPixmap, mPixmap.rect());
           }
       }
   }
 
public slots:
   void setPixmap(const QPixmap &pixmap) {
       mPixmap = pixmap;
       update();
   }
 
   void setKeepAspectRatio(const bool value) {
       mKeepAspectRatio = value;
   }
 
   bool keepAspectRatio() const {
       return mKeepAspectRatio;
   }
 
private:
   QPixmap mPixmap;
   bool mKeepAspectRatio;
};
 
#endif // SCALEDIMAGE_H
 
Собственно кода то мало совсем.

Да, но честно кода больше, чем я сделал. Я просто переопределил у себя метод отрисовки, беру размер объекта и ресайзю,  так много исхитрений как ты не делаю - все работает)

Всем спасибо за помощь, вопрос решен)
Если сохранять пропорции не требуется, то функция paintEvent сводиться к
Код
C++ (Qt)
void paintEvent(QPaintEvent *e) {
 if (!mPixmap.isNull()) {
   QPainter p(this);
   p.drawPixmap(e->rect(), mPixmap, mPixmap.rect());
  }
}
 
:)


Название: Re: Qlabel и QPixmap
Отправлено: NickSin от Октябрь 29, 2014, 13:45
Для справки.
Использовать QPixmap для масштабирования очень дорого и неэффективно, т.к. оный хранится на стороне граф.системы и предназначен для хранения статических картинок.
Тогда лучше использовать QImage? Или что вы тогда советуете на будущее?

http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt (http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt)

Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение QLabel, то переопределять класс всё равно придется. Вот еще один пример:
Код
C++ (Qt)
#ifndef SCALEDIMAGE_H
#define SCALEDIMAGE_H
 
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
 
class ScaledImage : public QWidget {
   Q_OBJECT
public:
   ScaledImage(QWidget *parent = 0) : QWidget(parent), mKeepAspectRatio(true) {}
 
protected:
   void paintEvent(QPaintEvent *e) {
       if (!mPixmap.isNull()) {
           QPainter p(this);
           if (mKeepAspectRatio){
               QPointF delta(e->rect().width() / (double)mPixmap.size().width(),
                             e->rect().height() / (double)mPixmap.size().height());
               QSize size;
               if (delta.x() < delta.y()) {
                   size.setWidth(delta.x() * mPixmap.size().width());
                   size.setHeight(delta.x() * mPixmap.size().height());
               } else {
                   size.setWidth(delta.y() * mPixmap.size().width());
                   size.setHeight(delta.y() * mPixmap.size().height());
               }
               QPoint topLeft((e->rect().size().width() - size.width()) / 2,
                              (e->rect().size().height() - size.height()) / 2);
               p.drawPixmap(QRect(topLeft, size), mPixmap, mPixmap.rect());
           } else {
               p.drawPixmap(e->rect(), mPixmap, mPixmap.rect());
           }
       }
   }
 
public slots:
   void setPixmap(const QPixmap &pixmap) {
       mPixmap = pixmap;
       update();
   }
 
   void setKeepAspectRatio(const bool value) {
       mKeepAspectRatio = value;
   }
 
   bool keepAspectRatio() const {
       return mKeepAspectRatio;
   }
 
private:
   QPixmap mPixmap;
   bool mKeepAspectRatio;
};
 
#endif // SCALEDIMAGE_H
 
Собственно кода то мало совсем.

Да, но честно кода больше, чем я сделал. Я просто переопределил у себя метод отрисовки, беру размер объекта и ресайзю,  так много исхитрений как ты не делаю - все работает)

Всем спасибо за помощь, вопрос решен)
Если сохранять пропорции не требуется, то функция paintEvent сводиться к
Код
C++ (Qt)
void paintEvent(QPaintEvent *e) {
 if (!mPixmap.isNull()) {
   QPainter p(this);
   p.drawPixmap(e->rect(), mPixmap, mPixmap.rect());
  }
}
 
:)

ну я вроде этого и сделал, немного переопределил свою задачу и сделал аналогично вашему примеру)


Название: Re: Qlabel и QPixmap
Отправлено: GreatSnake от Октябрь 30, 2014, 08:58
Тогда лучше использовать QImage?
Конечно.