2011-04-13 12 views
25

फिट करने के लिए क्यूटी में छवि प्रदर्शित करें मैंने पहले से ही एक फॉर्म पर एक छवि प्रदर्शित करने के कई तरीकों की कोशिश की है, लेकिन उनमें से कोई भी काम नहीं करता है।लेबल आकार

मैंने कई स्थानों को पढ़ा है कि लेबल बनाने और छवि को प्रदर्शित करने के लिए इसका सबसे आसान तरीका है। मेरे पास एक लेबल है, जो आकार लेआउट द्वारा निर्दिष्ट किया गया है, लेकिन अगर मैं इसे एक पिक्समैप के साथ एक छवि लोड करता हूं, तो लेबल छवि के आकार में बदल जाता है। अगर मैं टेक्स्ट या सीएसएस पृष्ठभूमि संपत्ति के रूप में आईएमजी टैग का उपयोग करता हूं, तो यह पूरी छवि प्रदर्शित नहीं करेगा। मैं क्या करना चाहता हूं कि छवि को लोड करना और लेबल में फिट करना, लेबल के आकार को नहीं बदलना, लेकिन जब मैं अपनी खिड़की का आकार बदलता हूं, और लेबल के आकार को भी बदलता हूं, तो छवि का भी आकार बदलना चाहिए ताकि यह हमेशा फिट रहे इसे में।

यदि लेबल का आकार प्राप्त करने का एकमात्र तरीका है, और पिक्समैप का आकार बदलना है तो यह फिट होगा, और आकार बदलने (सिग्नल) को संभालने के लिए, मैं पिक्समैप का आकार कैसे बदल सकता हूं? मुझे उम्मीद है कि मुझे पूरी चीज को QImage में सहेजने की आवश्यकता नहीं होगी और हर बार एक पिक्समैप बनाएंगी।

इसके अलावा, मैं इसे कैसे केन्द्रित कर सकता हूं? यदि यह चौड़ाई और ऊंचाई दोनों फिट नहीं हो सकता है, तो मैं छोटे आयाम को केंद्रित करना चाहता हूं।

ओह, और मैं ओवरफ्लो को संभालने के लिए स्लाइडर का उपयोग नहीं करना चाहता हूं।

उत्तर

18

QLabel::setScaledContents(bool) मदद करता है? image viewer example में भी कुछ उपयोगी जानकारी हो सकती है।

+2

एक तेजी से समाधान यह एक सेवर था, लेकिन यह मुझे छवि (यानी खींच कर एक बहुत बदसूरत परिणाम दिया: नहीं पहलू अनुपात को बनाए रखना)। मैं वैसे भी इसे समाधान के रूप में चिह्नित करूंगा। धन्यवाद। – SinistraD

+0

PyQt5 का उपयोग करके, यह समाधान काम नहीं करता है। 'setScaledContents' प्रदर्शित छवि आकार पर कोई प्रभाव नहीं प्रतीत होता है। – ely

13

मैं अपने स्वयं के प्रश्न का भी उत्तर दूंगा, लेकिन इसे समाधान के रूप में चिह्नित नहीं किया जाएगा, क्योंकि मैंने ऊपर दिया गया एक सरल अनुरोध किया था। मैं सब के बाद एक बहुत ही आसान समाधान का उपयोग नहीं कर पाया, इसलिए किसी को भी ऐसा कुछ करने की ज़रूरत है और इसके साथ खेलने का समय मेरे अंतिम कामकाजी कोड है। विचार QLabel का विस्तार करना और setPixmap और drawEvent विधियों को अधिभारित करना है।

QPictureLabel.hpp (हेडर फाइल)

#include "QImage.h" 
#include "QPixmap.h" 
#include "QLabel.h" 

class QPictureLabel : public QLabel 
{ 
private: 
    QPixmap _qpSource; //preserve the original, so multiple resize events won't break the quality 
    QPixmap _qpCurrent; 

    void _displayImage(); 

public: 
    QPictureLabel(QWidget *aParent) : QLabel(aParent) { } 
    void setPixmap(QPixmap aPicture); 
    void paintEvent(QPaintEvent *aEvent); 
}; 

QPictureLabel.cpp (कार्यान्वयन)

#include "QPainter.h" 

#include "QPictureLabel.hpp" 

void QPictureLabel::paintEvent(QPaintEvent *aEvent) 
{ 
    QLabel::paintEvent(aEvent); 
    _displayImage(); 
} 

void QPictureLabel::setPixmap(QPixmap aPicture) 
{ 
    _qpSource = _qpCurrent = aPicture; 
    repaint(); 
} 

void QPictureLabel::_displayImage() 
{ 
    if (_qpSource.isNull()) //no image was set, don't draw anything 
     return; 

    float cw = width(), ch = height(); 
    float pw = _qpCurrent.width(), ph = _qpCurrent.height(); 

    if (pw > cw && ph > ch && pw/cw > ph/ch || //both width and high are bigger, ratio at high is bigger or 
     pw > cw && ph <= ch || //only the width is bigger or 
     pw < cw && ph < ch && cw/pw < ch/ph //both width and height is smaller, ratio at width is smaller 
     ) 
     _qpCurrent = _qpSource.scaledToWidth(cw, Qt::TransformationMode::FastTransformation); 
    else if (pw > cw && ph > ch && pw/cw <= ph/ch || //both width and high are bigger, ratio at width is bigger or 
     ph > ch && pw <= cw || //only the height is bigger or 
     pw < cw && ph < ch && cw/pw > ch/ph //both width and height is smaller, ratio at height is smaller 
     ) 
     _qpCurrent = _qpSource.scaledToHeight(ch, Qt::TransformationMode::FastTransformation); 

    int x = (cw - _qpCurrent.width())/2, y = (ch - _qpCurrent.height())/2; 

    QPainter paint(this); 
    paint.drawPixmap(x, y, _qpCurrent); 
} 

प्रयोग: छवि wirthout प्रदर्शित करने के लिए एक सामान्य लेबल का उपयोग कर के रूप में ही setScaledContents

img_Result = new QPictureLabel(ui.parent); 
layout = new QVBoxLayout(ui.parent); 
layout->setContentsMargins(11, 11, 11, 11); 
ui.parent->setLayout(layout); 
layout->addWidget(img_Result); 

//{...} 

QPixmap qpImage(qsImagePath); 
img_Result->setPixmap(qpImage); 
+0

बहुत अच्छा जवाब, मुझे केवल अपने मूल विजेट के साथ समस्या है, यह – fredcrs

+0

बग्स है जब मैं पिक्समैप बदलता हूं और स्क्रीन का आकार बदलता हूं – fredcrs

+0

यह बहुत लंबा था (1 साल मेरे लिए बहुत अधिक है), मेरे पास क्यूटी भी नहीं है अब स्थापित है, लेकिन मैं मदद करने में सक्षम हो सकता है। आपको क्या त्रुटि मिल रही है और किस लाइन पर? क्या आपने डिबगिंग की कोशिश की है? या यह "बग" कैसे करता है? सबसे अच्छी चीज जो आप यहां कर सकते हैं, स्टैक ओवरफ्लो पर फॉलोअप प्रश्न पोस्ट करना है, इस प्रकार आपको पूरे उपयोगकर्ता-बेस से उत्तर के लिए एक बड़ा मौका मिलेगा। – SinistraD

16

असल में इस समस्या के लिए एक बहुत ही सरल संकल्प है। वहाँ दो चीजें आप संशोधित करना चाहिए:

  1. को स्केल की गई सामग्री सेट सच (जैसा कि ऊपर उल्लेख)
  2. नजरअंदाज कर दिया

    QLabel lblImage; 
    
    lblImage->setPixmap(QPixmap("big_image.jpg")); 
    
    lblImage->setScaledContents(true); 
    
    lblImage->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); 
    

को लेबल के आकार नीति सेट lblImage आकार बदलने है, तो स्वचालित रूप से, छवि लेबल के आकार के लिए strech जाएगा।

+0

मुझे लगता है कि छवि चौड़ाई/ऊंचाई अनुपात रखने के लिए कोई आसान समाधान नहीं है? –

+0

"अनदेखा" के साथ समस्या यह है कि तब लेबल को लेआउट को "विस्तारित" करने के लिए उपयोग नहीं किया जा सकता है। –

+0

PyQt5 का उपयोग करके, यह भी कोई काम नहीं करता है। 'QSizePolicy.Ignored' का प्रभाव इस बात पर असर नहीं पड़ता कि छवि का आकार बदल गया है या नहीं। – ely

6

अपने मूल pixmap की प्रतिलिपि रखें।तब कनेक्ट एक स्लॉट के लिए resized संकेत (या resizeEvent() समारोह को ओवरराइड) को लागू करने वाली इस:

lblImage->setPixmap(pixmap.scaled(lblImage->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); 
+0

कड़ी मेहनत की! बहुत बहुत धन्यवाद –

संबंधित मुद्दे