Преобразование между QLayout и QWidget

#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, может быть предпочтительнее.