Russian Qt Forum
Апрель 26, 2024, 18:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qlabel и QPixmap  (Прочитано 7673 раз)
NickSin
Гость
« : Октябрь 23, 2014, 17:49 »

Имеется QLabel, в который вписан qpixmap, являющейся, в свою очередь, qimage.
Мне нужно, чтоб с изменением размера QLabel'a  ресайзилось бы и изображение.

Скажите, в каком направлении "копать"?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Октябрь 23, 2014, 17:55 »

Скажите, в каком направлении "копать"?
В документацию?

Вот это не помогает?
void QLabel::setScaledContents(bool)
Записан
NickSin
Гость
« Ответ #2 : Октябрь 24, 2014, 10:30 »

Скажите, в каком направлении "копать"?
В документацию?

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

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

Offline Offline

Сообщений: 24


Просмотр профиля
« Ответ #3 : Октябрь 24, 2014, 14:02 »

http://stackoverflow.com/questions/14107144/how-do-i-make-an-image-resize-to-scale-in-qt
Записан
NickSin
Гость
« Ответ #4 : Октябрь 26, 2014, 14:18 »


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

Offline Offline

Сообщений: 24


Просмотр профиля
« Ответ #5 : Октябрь 26, 2014, 19:30 »

setScaledContents() и есть самое простое
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #6 : Октябрь 26, 2014, 20:36 »


Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение 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
 
Собственно кода то мало совсем.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
NickSin
Гость
« Ответ #7 : Октябрь 28, 2014, 11:34 »


Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение 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
 
Собственно кода то мало совсем.

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

Всем спасибо за помощь, вопрос решен)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Октябрь 28, 2014, 12:46 »

Для справки.
Использовать QPixmap для масштабирования очень дорого и неэффективно, т.к. оный хранится на стороне граф.системы и предназначен для хранения статических картинок.
Записан

Qt 5.11/4.8.7 (X11/Win)
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #9 : Октябрь 28, 2014, 14:56 »


Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение 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());
  }
}
 
Улыбающийся
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
NickSin
Гость
« Ответ #10 : Октябрь 29, 2014, 13:45 »

Для справки.
Использовать QPixmap для масштабирования очень дорого и неэффективно, т.к. оный хранится на стороне граф.системы и предназначен для хранения статических картинок.
Тогда лучше использовать QImage? Или что вы тогда советуете на будущее?


Спасибо за пример, но есть что-то попроще чем перераспределять свой класс?   Хотя те примеры рабочие, но на Маке у меня вылез здоровый критикал при первом запуске.
Если не нравиться стандартное поведение 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());
  }
}
 
Улыбающийся

ну я вроде этого и сделал, немного переопределил свою задачу и сделал аналогично вашему примеру)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Октябрь 30, 2014, 08:58 »

Тогда лучше использовать QImage?
Конечно.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.296 секунд. Запросов: 22.