كيفية المحافظة على الحاجيات نسبة الارتفاع في Qt ؟

StackOverflow https://stackoverflow.com/questions/452333

سؤال

كيف يمكن الحفاظ على الحاجيات نسبة الارتفاع في Qt و ماذا عن تمركز القطعة ؟

هل كانت مفيدة؟

المحلول

وليس لديك لتنفيذ مدير التخطيط الخاصة بك. يمكنك أن تفعل مع وراثة QWidget وreimplementing

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

والبقاء مربع. ومع ذلك، لا يعمل على ويندوز heightForWidth() المستوى الأعلى على X11، منذ ما يبدو بروتوكول X11 لا يدعم ذلك. أما بالنسبة للتمركز، يمكنك تمرير Qt::AlignCenter كمعلمة الثالث من QBoxLayout::addWidget() أو المعلمة الخامس من QGridLayout::addWidget().

<قوية> ملاحظة: في إصدارات أحدث من كيو تي على الأقل، QWidget لا تملك heightForWidth أو widthForHeight بعد الآن (حتى لا يمكن تجاوزها)، وبالتالي setWidthForHeight(true) أو setHeightForWidth(true) <لأ href = "HTTP: / /doc.qt.io/qt-5/qsizepolicy.html#setWidthForHeight "يختلط =" نوفولو noreferrer "> ليس لها سوى تأثير لأحفاد QGraphicsLayout .

نصائح أخرى

الجواب الصحيح هو إنشاء الخاص بك مخصص مدير تخطيط.هذا ممكن من خلال subclassing QLayout.

أساليب تنفيذ عندما subclassing QLayout

الفراغ addItem(QLayoutItem* البند) ؛
ويضيف البند إلى تخطيط.
عد الباحث() const ؛
إرجاع عدد العناصر.
QLayoutItem* itemAt(int index) const ؛
يعود البند المرجعي في الفهرس أو 0 إذا كان هناك لا شيء.
QLayoutItem* takeAt(مؤشر كثافة العمليات) ؛
يأخذ وإرجاع البند من تخطيط من مؤشر أو بإرجاع 0 إذا كان هناك لا شيء.
Qt::التوجهات expandingDirections() const ؛
ترجع تخطيطات توسيع الاتجاهات.
منطقي hasHeightForWidth() const ؛
يقول إذا كان تخطيط يعالج ارتفاع عرض الحساب.
QSize التي() const ؛
ترجع تخطيطات الحجم الأدنى.
الفراغ setGeometry(const QRect& rect);
مجموعات هندسة تخطيط العناصر داخله.هنا لديك للحفاظ على نسبة الارتفاع والقيام توسيط.
QSize sizeHint() const ؛
يعود حجم المفضل للتخطيط.

مزيد من القراءة

ودعوة resize() من داخل resizeEvent() لم يعمل بشكل جيد بالنسبة لي - في أحسن الأحوال سوف يسبب الخفقان كما يتم تغيير حجم نافذة مرتين (لديك)، في أسوأ الأحوال حلقة لا نهائية

.

وأعتقد أن الطريقة "الصحيحة" للحفاظ على نسبة الارتفاع الثابت هو خلق تخطيط مخصص. سيكون لديك لتجاوز مجرد طريقتين، QLayoutItem::hasHeightForWidth() وQLayoutItem::heightForWidth().

في حالتي تجاوز heightForWidth () لا يعمل. وبالنسبة لشخص ما، فإنه قد يكون من المفيد للحصول على مثال عمل من استخدام تغيير حجم الحدث.

وفي أول فرعية 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 وظيفة. انها ينبغي تحديد كود خارج تعريف 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 وتعيينه EventFilter المستمع لاستهداف الكائن. مرشحات الحدث بفضل هذه الإجابة.

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

والآن تصفية سوف تتلقى جميع الأحداث targetWidget وتعيين الارتفاع الصحيح في الحدث تغيير الحجم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top