2012-06-06 2 views
1

내 앱에 이미지를 표시하고 싶습니다. QtDesigner를 사용하여 UI를 디자인 한 다음 pyqt를 사용하여 코딩합니다. 문제는 표시 될 이미지가 UI의 위젯 크기보다 큰 것입니다. 다음과 같이 QT - Widget Image Viewer DemoPyQt/Qt : Qlabel 위젯에서 이미지를 늘리는 방법은 무엇입니까?

추가 imagelabel 및 scrollArea, 코드 : 나는 offical 한 데모를 참조

---- UI init ---- 
self.label = QtGui.QLabel(self.centralwidget) 
self.label.setGeometry(QtCore.QRect(40, 140, 361, 511)) 
self.label.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred) 
self.label.setObjectName(_fromUtf8("label")) 
self.scrollArea = QtGui.QScrollArea(self.centralwidget) 
self.scrollArea.setGeometry(QtCore.QRect(40, 140, 361, 511)) 
self.scrollArea.setWidget(self.label) 
self.scrollArea.setObjectName(_fromUtf8("scrollArea")) 

---- function ---- 
filename = "./Penguins.jpg" 
image = QtGui.QImage(filename) 
pp = QtGui.QPixmap.fromImage(image) 
lbl = QtGui.QLabel(self.label) 
lbl.setPixmap(pp) 
self.scrollArea.setWidgetResizable(True) 
lbl.show() 

하지만 이미지를 스트레칭하지 않습니다, 심지어 더 스크롤 막대가 표시되지 않습니다!

답변

10

self.label.setScaledContents(true);으로 전화해야합니다. 따라서 QLabel은 pixmap/image의 크기에 맞게 크기가 조정되고 스크롤 막대가 표시됩니다. 이 documentation을 참조하십시오.

+0

나는 "self.label.setScaledContents (참) 추가 필요 (하지만 최대) 경우

이 작은 도우미는 항상 유지, 라벨의 최대 크기에 맞게 가로 세로 비율을 이미지를 축소한다 "내 코드에서,하지만 여전히 작동하지 않습니다! 위의 코드를 볼 수 있습니다. labelArea의 크기를 레이블 크기와 같게 설정합니다. 문제인가? – whuiscool

+0

해결했습니다! 디버그에서 나는 'lbl = QtGui.QLabel (self.label) '이 잘못되었음을 발견했습니다. – whuiscool

0

저는 PyQt를 사용하지 않지만 QtPixmap 컨트롤에는 scaled() 함수가 있습니다. 당신은 전에 라벨에 넣어 이미지 크기를 조정할 수 있습니다 :

  • 축소()
  • scaledToHeight()
  • scaledToWidth()

이 내가 C에서 사용하는 샘플 코드를 ++ 크기를 조정하려면 QLabel의

imatge.load("sprite.png"); 
QPixmap imatge2 = imatge.scaled(ui->label->width(),ui->label->height()); 
+0

어떻게 당신의 레이블의 크기와 scrollArea의 크기를 설정합니까? 내 코드를 볼 수 있습니다, 나는 scrollArea의 크기를 레이블의 크기와 동일하게 설정합니다. 문제인가? – whuiscool

+0

나는 그것을 해결했다! 디버그를 통해 나는 'lbl = QtGui.QLabel (self.label)'이 잘못되었음을 발견했다. – whuiscool

4

디폴트의 구현 : 그렇지 않았기 때문에 setScaledContents이 나를 위해 작동하지 않는 다음 QLabel 크기 이미지 이미지의 크기가 큰 경우 레이블의 최대 크기를 유지하도록 가로 세로 비율을 유지할 수 있습니다.

/** 
* Fill a QLabel widget with an image file, respecting the widget's maximum sizes, 
* while scaling the image down if needed (but not up), and keeping the aspect ratio 
* Returns false if image loading failed 
****************************************************************************/ 
static bool SetLabelImage(QLabel *label, QString imageFileName) 
{ 
    QPixmap pixmap(imageFileName); 
    if (pixmap.isNull()) return false; 

    int w = std::min(pixmap.width(), label->maximumWidth()); 
    int h = std::min(pixmap.height(), label->maximumHeight()); 
    pixmap = pixmap.scaled(QSize(w, h), Qt::KeepAspectRatio, Qt::SmoothTransformation); 
    label->setPixmap(pixmap); 
    return true; 
} 
+0

파이썬에서 이것을 어떻게 구현할 수 있는지 알고 있습니까? –

+0

@Vitto @Petrucio에서 제공하는 코드는 Python으로 쉽게 재 작성 될 수 있습니다. 'std :: min'과'std :: max'는 파이썬의 내장 함수로 대체 될 수 있습니다. – rbaleksandar

관련 문제