كيفية المحافظة على الحاجيات نسبة الارتفاع في Qt ؟
-
19-08-2019 - |
سؤال
كيف يمكن الحفاظ على الحاجيات نسبة الارتفاع في 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 وتعيين الارتفاع الصحيح في الحدث تغيير الحجم.