Qscrollarea의 초기 크기를 설정하는 방법은 무엇입니까?
문제
나는 이것이 매우 구체적인 C ++ 및 QT 관련 질문이라는 것을 알고 있지만 어쨌든 누군가가 나를 도울 수있을 것입니다 ...
아래 코드를 참조하십시오 : 스크롤 영역 내에 이미지를 표시하고 싶습니다. 스크롤 영역의 뷰 포트는 정의 된 초기 크기를 가져야합니다. 즉, 이미지의 크기가 뷰 포트의 초기 크기보다 크면 스크롤 막대가 표시됩니다.
// create label for displaying an image
QImage image( ":/test.png" );
QLabel *label = new QLabel( this );
label->setPixmap( image.toPixmap() );
// put label into scroll area
QScollArea *area = new QScrollArea( this );
area->setWidget( label );
// set the initial size of the view port
// NOTE: This is what I'd like to do, but this method does not exist :(
area->setViewPortSize( QSize( 300, 300 ) );
보기 포트가 초기 크기보다 다른 크기를 얻도록 전체 응용 프로그램을 크기를 조정할 수 있습니다.
불행히도 나는보기 포트의 크기를 설정하는 방법을 알 수 없었습니다. QT의 레이아웃 메커니즘은보기 포트의 기본 크기를 설정하는 것처럼 보이지만 지금까지는 변경할 수 없었습니다. 새로운 크기를 설정합니다
area->setMinimumSize( QSize( 300, 300 ) );
실제로 요구 된 크기를 설정하지만 스크롤 영역은 300x300보다 작은 크기로 크기를 조정할 수있는 기능을 느슨하게됩니다.
어떤 아이디어?
해결책
나는 당신이 문제를 잘못된 방식으로보고 있다고 생각합니다. Qscrollarea는 프레임이나 Qmainwindow에 넣은 위젯입니다. 위젯의 크기는 포함 된 위젯의 레이아웃에 의해 제어됩니다.
Trolltech 에서이 예를 살펴보십시오. 이미지 뷰어 예
다른 팁
스크롤 영역이 최상위 위젯입니까? 그렇다면 단순히 전화하십시오
area->resize(300,300);
계층 구조 내부에있는 경우 적절한 대상 (복잡한)을 조정하거나 해당 지역의 최소 크기를 설정해야합니다. SizeHint가 QSize (300,300)라고 가정하면 정의 된 내용에 따라 적절한 크기 정책을 줄 수 있다고 가정하면 LayoutPolicy를 실험하려고 시도 할 수도 있습니다. https://doc.qt.io/qt-5/qsizepolicy.html#policy-enum
당신은 시도 할 수 있습니다:
class MyScrollArea : public QScrollArea
{
virtual QSize sizeHint() const { return QSize( 300, 300 ); }
};
// create label for displaying an image
QImage image( ":/test.png" );
Label *label = new QLabel;
label->setPixmap( image.toPixmap() );
// put label into scroll area
QScollArea *area = new MyScrollArea( this );
area->setWidget( label );
그러나 레이아웃과 QT는 놀랍게도 부두입니다. IMO는 가장 기능적인 부분입니다.
그렇지 않은 경우 다양한 위젯에서 qwidget :: resize ()를 호출하십시오.
내부 영역이 300x300이되도록 위젯을 크기로 크기를 크기로 쉽게 할 수 있다고 생각하지 않습니다. 스크롤 영역은 QWIDGET에서 물려받는 프레임 유형이므로 퍼지 할 수 있습니다. 이것은 당신이 그냥 전화 할 수 있음을 의미합니다 area->resize( 300 + fudge, 300 + fudge )
, 퍼지 값이 프레임의 도면으로 인한 여분의 비트를 설명하는 곳.
그러나 이것이 동적으로 재생 가능한 대화 상자에서 작동 할 것이라고 확신하지 못합니다. 나는 이런 일을 한 적이 없다.
스크롤 영역 안에 이미지를 표시하려는 경우 라벨과 함께 진행되지 않습니다.
qgraphicsview/qgraphicsscene/qgraphicpixmapitem (스크롤 영역 및 레이블 대신)을 사용해야합니다. 이미지를 표시 할 때 성능이 훨씬 좋습니다. 스크롤 영역과 레이블은 스크롤 막대를 사용하여 움직일 때 이미지를 매우 열렬히 다시 드러냅니다.
예를 들어, "qgvimageview"라는 GUI에 qgraphicsView가있는 ".ui"파일이 있고 "image"라는 qimage가 있습니다.
QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
QPixmap pixTmp(QPixmap::fromImage(image));
QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
ppixItem->setPos(0,0);
QT 문서를 확인하십시오. BTW : 이것은 QT 4.2에서 소개되었습니다
이것이 구체적으로 문제를 해결할 것인지 확실하지 않지만 QgraphicsView가 당신이하려는 일에 더 잘 반응 할 가능성이 있습니다.
사용하는 것은 어떻습니까
area->setGeometry(int x, int y, int w, int h);