#c #qt #qwidget #qlayout
#c #qt #qwidget #qlayout
Вопрос:
У меня есть два примера, в которых я в основном создаю объекты-оболочки, а не то, что в идеале было бы простым преобразованием.
Если foo
QWidget*
экземпляр создан ранее, могу ли я избежать создания QLayout
для него оболочки:
const auto layout = new QVBoxLayout();
layout->addWidget( foo );
const auto frame = new QLabel( QLatin1String( "Why Do I Need a Layout?" ) );
frame->setLayout( layout );
Если foo
QLayout*
экземпляр создан ранее, могу ли я избежать создания QWidget
для него оболочки:
const auto widget = new QWidget();
widget->setLayout( foo );
const auto tabs = new QTabWidget();
tabs->addTab( widget, QLatin1String( "Why Do I Need a Widget?" ) );
Комментарии:
1. Я не уверен, о чем вы спрашиваете, или чего вы хотите достичь. Не могли бы вы добавить некоторые подробности?
2.
layout
это оболочка, мне не нужнаQLayout
, она ничего не делает, но я не могуframe->setWidget( foo );
вызватьQLabel
, потому что у нее нет этой функции. Я спрашиваю, есть ли способ пропуститьlayout
оболочку. То же самое дляwidget
оболочки.3. Просто чтобы уточнить: вы хотите добавить дочерний элемент в виджет без добавления макета, и вы хотите добавить дочерний макет, где ожидается QWidget?
4. Виджет не должен иметь макет. Вы можете добавить дочерние виджеты, просто установив их в качестве родительских, но тогда вам придется вручную настроить размер и положение дочерних виджетов.
5. @JonathanMee Да, это касается первого случая. Я не говорю, что это приведет к тому же поведению. Как я уже сказал, вам придется вручную настроить размер и положение дочернего виджета.
Ответ №1:
Просто всегда можно написать свои собственные функции-оболочки:
QLayout* wrap(QWidget* w){
auto layout = new QVBoxLayout();
layout->addWidget( w );
return layout;
}
QWidget* wrap(QLayout* l){
auto widget = new QWidget();
widget->setLayout( l );
return widget;
}
Комментарии:
1. Хммм… Я полагаю, это разумно, если нет более прямого способа преобразования.
Ответ №2:
Виджет не должен иметь макет. Вы можете добавить дочерние виджеты к виджету, установив виджет в качестве родительского. Но тогда вам придется вручную настроить размер и положение дочерних виджетов.
Комментарии:
1. Это был лучший ответ для моей ситуации, но это была довольно уникальная ситуация. Для широких слоев населения решение, предложенное @BeniBela, может быть предпочтительнее.