문제

QT에서 위젯 종횡비를 어떻게 유지할 수 있으며 위젯을 중심으로하는 것은 어떻습니까?

도움이 되었습니까?

해결책

자신의 레이아웃 관리자를 구현할 필요가 없습니다. 상속으로 할 수 있습니다 QWidget 그리고 상환

int QWidget::heightForWidth( int w ) { return w; }

정사각형을 유지합니다. 하지만, heightForWidth() X11 프로토콜이이를 지원하지 않기 때문에 X11의 Toplevel Windows에서는 작동하지 않습니다. 센터링은 통과 할 수 있습니다 Qt::AlignCenter 세 번째 매개 변수로 QBoxLayout::addWidget() 또는 5 번째 매개 변수 QGridLayout::addWidget().

메모: 최신 버전의 QT에서는 QWIDGET이 heightForWidth 또는 widthForHeight 더 이상 (그래서 그들은 재정의 할 수 없습니다), 따라서 setWidthForHeight(true) 또는 setHeightForWidth(true) QgraphicsLayout의 후손에게만 영향을 미칩니다.

다른 팁

정답은 사용자 정의 레이아웃 관리자를 만드는 것입니다. 서브 클래싱으로 가능합니다 Qlayout.

Qlayout 서브 클래싱시 구현 방법

void additem (qlayoutitem* 항목);
레이아웃에 항목을 추가합니다.
int count () const;
항목 수를 반환합니다.
qlayoutitem* itemat (int index) const;
인덱스에서 항목 참조를 반환하거나 없으면 0이 없습니다.
qlayoutitem* takeat (int index);
인덱스에서 레이아웃에서 항목을 가져 가거나 반환하거나 없으면 0이없는 경우 0을 반환합니다.
QT :: 방향 확장 방향 () const;
방향을 확장하는 레이아웃을 반환합니다.
bool hasheightforwidth () const;
레이아웃이 너비 계산을 위해 높이를 처리하는지 알려줍니다.
qsize minimumSize () const;
레이아웃을 최소 크기로 반환합니다.
void setgeometry (const qrect & rect);
레이아웃의 형상과 그 안에있는 항목을 설정합니다. 여기서는 종횡비를 유지하고 중심을 수행해야합니다.
qsize sizehint () const;
레이아웃의 선호하는 크기를 반환합니다.

추가 독서

부름 resize() 안으로부터 resizeEvent() 저를 위해 잘 작동 한 적이 없습니다. 기껏해야 창문이 두 번 크기를 조정하여 최악의 무한 루프로 깜박일 것입니다.

고정 된 종횡비를 유지하는 "올바른"방법은 사용자 정의 레이아웃을 만드는 것입니다. 두 가지 방법 만 무시해야합니다. QLayoutItem::hasHeightForWidth() 그리고 QLayoutItem::heightForWidth().

내 경우 heightforwidth ()를 우선적으로 사용하지 않습니다. 그리고 누군가에게는 Resize Event 사용의 작업 예제를 얻는 것이 도움이 될 수 있습니다.

처음에는 필터를 생성하기 위해 qobject를 서브 클래스로합니다. 이벤트 필터에 대한 자세한 내용.

class FilterObject:public QObject{
public:
    QWidget *target = nullptr;//it holds a pointer to target object
    int goalHeight=0;
    FilterObject(QObject *parent=nullptr):QObject(parent){}//uses QObject constructor
    bool eventFilter(QObject *watched, QEvent *event) override;//and overrides eventFilter function
};

그런 다음 EventFilter 기능. 경고를 방지하기 위해 Code는 FilterObject 정의 외부에서 정의되어야합니다. 이 답변 덕분에.

bool FilterObject::eventFilter(QObject *watched, QEvent *event) {
    if(watched!=target){//checks for correct target object.
        return false;
    }
    if(event->type()!=QEvent::Resize){//and correct event
        return false;
    }

    QResizeEvent *resEvent = static_cast<QResizeEvent*>(event);//then sets correct event type

    goalHeight = 7*resEvent->size().width()/16;//calculates height, 7/16 of width in my case
    if(target->height()!=goalHeight){
        target->setFixedHeight(goalHeight);
    }

    return true;
};

그런 다음 기본 코드에서 FilterObject를 작성하여 Target Object의 EventFilter 리스너로 설정하십시오. 이 답변 덕분에.

FilterObject *filter = new FilterObject();
QWidget *targetWidget = new QWidget();//let it be target object
filter->target=targetWidget;
targetWidget->installEventFilter(filter);

이제 필터는 모든 TargetWidget의 이벤트를 수신하고 Resize Event에서 올바른 높이를 설정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top