Название: 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?
Конечно.
|