दिलचस्प पोस्ट
एक्लिप्से में एक एकल यूजिट परीक्षण चला रहा है एक EventTrigger के साथ एक संपत्ति की स्थापना एंड्रॉइड सपोर्ट लाइब्रेरी अपडेट करें 23.2.0 कारण त्रुटि: XmlPullParserException बाइनरी XML फ़ाइल लाइन # 17 <वेक्टर> टैग की आवश्यकता है viewportWidth> 0 समय अवधि के बाद कोड रोक दें जावा में दूसरे धागे से स्विंगिंग GUI (स्विंग) घातांक चलने की औसत औसत टाइम्स पर नमूना एंड्रॉइड सपोर्ट डिज़ाइन लाइब्रेरी के साथ उपलब्ध कराई गई एफएबी में छाया कैसे जोड़ें? क्या सेट-टाइमआउट बिना किसी विलंब के साथ ही फ़ंक्शन तुरंत क्रियान्वित करता है? रूबी हैश की तुलना क्या निरंतर के रूप में एक सरणी घोषित करना संभव है मैं आईओएस के लिए फोनगैप में यह स्क्रिप्ट कैसे स्थापित करूं? घटना जब window.location.href में परिवर्तन jQuery चयनकर्ता जहां पाठ = कुछ मान console.writeline और System.out.println स्काला सूची सम्मिलन, ::: बनाम ++

क्यूटी: एक QLabel आकार में एक QPixmap आकार जबकि उसके पहलू अनुपात रखते हुए

मैं उपयोगकर्ता के लिए एक बड़ा, गतिशील रूप से बदलते QPixmap की सामग्री प्रदर्शित करने के लिए QLabel का उपयोग करता हूं। उपलब्ध इस जगह के आधार पर इस लेबल को छोटा / बड़े बनाने के लिए अच्छा होगा स्क्रीन आकार हमेशा QPixmap के रूप में बड़ा नहीं है

QSizePolicy sizeHint() के पहलू अनुपात को रखते हुए sizeHint() का आकार बदलने के लिए मैं QLabel के QSizePolicy और sizeHint() को कैसे संशोधित कर सकता हूँ?

मैं QLabel के minimumSize() को संशोधित नहीं कर सकता, minimumSize() सेट minimumSize() को शून्य पर सेट करने में मदद नहीं करता QLabel पर सेट की गई hasScaledContents() बढ़ते हुए अनुमति देता है, लेकिन पहलू अनुपात hasScaledContents() तोड़ता है …

उप-क्लासिंग QLabel ने मदद की, लेकिन यह समाधान केवल एक साधारण समस्या के लिए बहुत अधिक कोड जोड़ता है …

कोई भी स्मार्ट संकेत यह subclassing बिना कैसे पूरा करने के लिए?

Solutions Collecting From Web of "क्यूटी: एक QLabel आकार में एक QPixmap आकार जबकि उसके पहलू अनुपात रखते हुए"

लेबल आकार बदलने के लिए आप विस्तार या न्यूनतम विस्तार जैसे लेबल के लिए उपयुक्त आकार नीति का चयन कर सकते हैं।

आप जब भी बदलते हैं, तब भी आप अपने पहलू अनुपात को रखकर पिक्समाप स्केल कर सकते हैं:

 QPixmap p; // load pixmap // get label dimensions int w = label->width(); int h = label->height(); // set a scaled pixmap to awxh window keeping its aspect ratio label->setPixmap(p.scaled(w,h,Qt::KeepAspectRatio)); 

दो जगहें हैं जहां आपको यह कोड जोड़ना चाहिए:

  • जब पिक्समैप अपडेट होता है
  • उस विजेट के resizeEvent को resizeEvent जिसमें लेबल शामिल है

मैंने यह लापता उप-वर्ग QLabel को पॉलिश किया है यह भयानक है और अच्छी तरह से काम करता है

aspectratiopixmaplabel.h

 #ifndef ASPECTRATIOPIXMAPLABEL_H #define ASPECTRATIOPIXMAPLABEL_H #include <QLabel> #include <QPixmap> #include <QResizeEvent> class AspectRatioPixmapLabel : public QLabel { Q_OBJECT public: explicit AspectRatioPixmapLabel(QWidget *parent = 0); virtual int heightForWidth( int width ) const; virtual QSize sizeHint() const; QPixmap scaledPixmap() const; public slots: void setPixmap ( const QPixmap & ); void resizeEvent(QResizeEvent *); private: QPixmap pix; }; #endif // ASPECTRATIOPIXMAPLABEL_H 

aspectratiopixmaplabel.cpp

 #include "aspectratiopixmaplabel.h" //#include <QDebug> AspectRatioPixmapLabel::AspectRatioPixmapLabel(QWidget *parent) : QLabel(parent) { this->setMinimumSize(1,1); setScaledContents(false); } void AspectRatioPixmapLabel::setPixmap ( const QPixmap & p) { pix = p; QLabel::setPixmap(scaledPixmap()); } int AspectRatioPixmapLabel::heightForWidth( int width ) const { return pix.isNull() ? this->height() : ((qreal)pix.height()*width)/pix.width(); } QSize AspectRatioPixmapLabel::sizeHint() const { int w = this->width(); return QSize( w, heightForWidth(w) ); } QPixmap AspectRatioPixmapLabel::scaledPixmap() const { return pix.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); } void AspectRatioPixmapLabel::resizeEvent(QResizeEvent * e) { if(!pix.isNull()) QLabel::setPixmap(scaledPixmap()); } 

उम्मीद है की वो मदद करदे! (अद्यतन resizeEvent , प्रति @ dmzl के उत्तर)

मैंने फ़िएट के AspectRatioPixmapLabel पहलू का उपयोग करने की कोशिश की, लेकिन कुछ समस्याओं का अनुभव किया:

  • कभी-कभी मेरे ऐप ने आकार परिवर्तन की घटनाओं के अनंत लूप में प्रवेश किया। मैंने इसे वापस QLabel::setPixmap(...) के कॉल के लिए resizeEvent विधि के अंदर का पता लगाया, क्योंकि QLabel वास्तव में updateGeometry को setPixmap अंदर कॉल updateGeometry है, जो setPixmap आकार की घटनाओं को चालू कर सकता है …
  • QScrollArea युक्त विजेट (मेरे मामले में एक QScrollArea ) द्वारा अनदेखा किया जा रहा है जब तक मैं लेबल के लिए एक आकार की नीति स्थापित करना शुरू कर दिया, स्पष्ट रूप से बुला नीति policy.setHeightForWidth(true)
  • मैं चाहता हूं कि लेबल कभी भी मूल पिक्समैप आकार से अधिक न हो
  • QLabel का minimumSizeHint() का कार्यान्वयन लेबल वाले पाठ के लिए कुछ जादू करता है, लेकिन हमेशा आकार की नीति को डिफ़ॉल्ट पर रीसेट करता है, इसलिए मुझे इसे अधिलेखित करना पड़ा

उसने कहा, यह मेरा समाधान है। मुझे पता चला कि मैं सिर्फ setScaledContents(true) उपयोग कर सकता है और QLabel को रीसाइज़िंग संभाल दें। बेशक, यह उस विजेट / लेआउट पर निर्भर करता है जो heightForWidth सम्मान कर रहा है।

aspectratiopixmaplabel.h

 #ifndef ASPECTRATIOPIXMAPLABEL_H #define ASPECTRATIOPIXMAPLABEL_H #include <QLabel> #include <QPixmap> class AspectRatioPixmapLabel : public QLabel { Q_OBJECT public: explicit AspectRatioPixmapLabel(const QPixmap &pixmap, QWidget *parent = 0); virtual int heightForWidth(int width) const; virtual bool hasHeightForWidth() { return true; } virtual QSize sizeHint() const { return pixmap()->size(); } virtual QSize minimumSizeHint() const { return QSize(0, 0); } }; #endif // ASPECTRATIOPIXMAPLABEL_H 

aspectratiopixmaplabel.cpp

 #include "aspectratiopixmaplabel.h" AspectRatioPixmapLabel::AspectRatioPixmapLabel(const QPixmap &pixmap, QWidget *parent) : QLabel(parent) { QLabel::setPixmap(pixmap); setScaledContents(true); QSizePolicy policy(QSizePolicy::Maximum, QSizePolicy::Maximum); policy.setHeightForWidth(true); this->setSizePolicy(policy); } int AspectRatioPixmapLabel::heightForWidth(int width) const { if (width > pixmap()->width()) { return pixmap()->height(); } else { return ((qreal)pixmap()->height()*width)/pixmap()->width(); } } 

मैं पहलू अनुपात को ठीक करने के लिए बस contentsMargin का उपयोग करता हूँ

 #pragma once #include <QLabel> class AspectRatioLabel : public QLabel { public: explicit AspectRatioLabel(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); ~AspectRatioLabel(); public slots: void setPixmap(const QPixmap& pm); protected: void resizeEvent(QResizeEvent* event) override; private: void updateMargins(); int pixmapWidth = 0; int pixmapHeight = 0; }; 
 #include "AspectRatioLabel.h" AspectRatioLabel::AspectRatioLabel(QWidget* parent, Qt::WindowFlags f) : QLabel(parent, f) { } AspectRatioLabel::~AspectRatioLabel() { } void AspectRatioLabel::setPixmap(const QPixmap& pm) { pixmapWidth = pm.width(); pixmapHeight = pm.height(); updateMargins(); QLabel::setPixmap(pm); } void AspectRatioLabel::resizeEvent(QResizeEvent* event) { updateMargins(); QLabel::resizeEvent(event); } void AspectRatioLabel::updateMargins() { if (pixmapWidth <= 0 || pixmapHeight <= 0) return; int w = this->width(); int h = this->height(); if (w <= 0 || h <= 0) return; if (w * pixmapHeight > h * pixmapWidth) { int m = (w - (pixmapWidth * h / pixmapHeight)) / 2; setContentsMargins(m, 0, m, 0); } else { int m = (h - (pixmapHeight * w / pixmapWidth)) / 2; setContentsMargins(0, m, 0, m); } } 

अब तक मेरे लिए पूरी तरह से काम करता है। आपका स्वागत है।