2011-04-13 4 views
25

이미 양식에 이미지를 표시 할 때 여러 가지 방법을 시도했지만 그 중 어느 것도 내가 원하는 방식으로 작동하지 않습니다.이미지를 Qt로 표시하여 레이블 크기에 맞 춥니 다

가장 쉬운 방법은 레이블을 만들어 이미지를 표시하는 것입니다. 나는 크기가 레이아웃에 의해 지정된 레이블을 가지고 있지만 pixmap을 사용하여 이미지에 이미지를로드하면 레이블의 크기가 이미지의 크기로 조정됩니다. img 태그를 텍스트 또는 CSS 배경 속성으로 사용하면 전체 이미지가 표시되지 않습니다. 내가 무엇을하고 싶습니다 이미지를로드하고 라벨의 크기를 변경하지 레이블에 맞게하지만, 내 창 크기를 조정할 때뿐만 아니라 레이블의 크기를 조정하여, 이미지도 너무 항상 맞게됩니다 크기를 조정해야합니다 그것으로.

유일한 방법은 레이블의 크기를 얻고 크기가 맞도록 pixmap의 크기를 조정하고 resize 이벤트 (신호)를 처리하는 경우 어떻게 pixmap의 크기를 조정할 수 있습니까? 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 년은 나에게 너무 비싸다.) Qt도 없다. 더 이상 설치되지 않았지만 도움을 드릴 수 있습니다. 어떤 오류가 발생하고 어떤 라인에 있습니까? 디버깅을 시도 했습니까? 아니면 어떻게 "버그"? 여기에서 할 수있는 최선의 방법은 stackoverflow에 대한 후속 질문을 게시하는 것입니다. 따라서 전체 사용자 기반의 답변에 대한 더 큰 기회를 얻을 수 있습니다. – SinistraD

16

사실이 문제는 매우 간단한 해결책입니다. 두 가지 수정해야 있습니다

  1. 는로 스케일의 콘텐츠를 설정 lblImage 크기 조정하는 경우
  2. 무시

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

에 레이블의 크기 정책을 설정 (위에서 언급 한) 사실 자동으로 이미지가 레이블 크기만큼 늘어납니다.

+0

이미지 너비/높이 비율을 유지하는 간단한 해결책이 없다고 생각하십니까? –

+0

"무시 된"문제는 레이블을 사용하여 레이아웃을 "확장"할 수 없다는 것입니다. –

+0

PyQt5를 사용하면이 방법도 효과가 없습니다. 'QSizePolicy.Ignored'는 이미지의 크기를 재조정할지 여부에 영향을 미치지 않습니다. – ely

6

원본 복사본을 보관하십시오. pixmap.그런 다음 슬롯에 resized 신호를 연결 (또는 resizeEvent() 함수를 재정의)이 구현하는 : 이것은 보호기했다 빠른 솔루션을

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

upvoted hard! 정말 고맙습니다 –

관련 문제