2016-11-27 4 views
3

Я хотел бы использовать тот же виджет в двух разных макетах в Qt. Вот мой код:Использовать тот же виджетов в двух разных макетах в Qt

QWidget *myWidget = new QWidget; 

QFormLayout *layout1 = new QFormLayout; 
layout1->addWidget(myWidget); 

QFormLayout *layout2 = new QFormLayout; 
layout2->addWidget(myWidget); 

Виджет, как это должно быть в layout2, но не виден в layout1.

Обходным способом было бы создать два разных виджета myWidget, но я хотел бы знать, есть ли лучший способ сделать.

Почему это происходит и каков правильный способ сделать это?

+0

Вы хотите, чтобы виджет отображался одновременно в двух разных местах? –

+0

@VaughnCato Да (хотя оба макета не будут видны одновременно) –

ответ

4

addWidget передает право собственности с layout1 в layout2.
Деревья объектов - это способ, которым Qt использует для организации объектов. Например, элемент, который имеет родителя , отображается в его системе координат родителя и графически обрезается границами его родителя.
Вы можете попробовать обойти ограничения, но это не то, как вы должны использовать Qt, и я не буду предлагать его.
Если вам нужны два виджета, создайте два виджета. Вот как разрабатывается Qt и как его следует использовать.

Для получения дополнительной информации о модели объектов Qt см. here.

+0

Планы IIRC не поддерживают право собственности, они просто передают их родителям. Обратите внимание, что родительский макет - это 'QWidget', а' QLayout' сам не получается из виджета, поэтому даже в случае вложенных макетов родитель является самым нижним виджетами. Кроме того, родитель QWidget тоже виджет, а не 'QObject', поэтому макет не может взять на себя ответственность за виджет, даже если бы даже для меня это имело бы больше смысла. – dtech

+0

@ddriver 'QFormLayout' наследует' QLayout', а последний наследует 'QObject' (по крайней мере, так говорит документация). 'addWidget' вызывает' addItem' (см. http://doc.qt.io/qt-5/qlayout.html # addItem), и, опять же, в документации указано, что _ _ ​​Право собственности на элемент переносится в макет, и ответственность за его размещение заключается в его удалении. Так что ваши рассуждения где-то есть. – skypjack

+0

@ddriver Я еще раз прочитал ваш комментарий. Я понял то, что вы сейчас имеете в виду. Ну, ответ по-прежнему применяется, я не понимаю, как такой комментарий потребует изменить его. Вы предлагаете добавить более подробную информацию или что-то еще? – skypjack

3

У вас не может быть один и тот же объект в нескольких местах. Существует только один экземпляр, и он живет только в одном месте. У вас может быть только несколько ссылок. Конечно, макет не принимает экземпляр виджета, а ссылку (указатель) на него, но дизайн Qt таков, что добавление виджета в макет передаст право собственности на основной виджет макета. И это имеет смысл, два макета могут вызвать другую геометрию виджета и как один виджет имеет две геометрии за одно и то же время? Даже если это возможно теоретически, это невозможно без абстрагирования геометрии от виджета, а в случае Qt геометрия является частью виджета, поэтому это невозможно. И это лишь один из многих аспектов, которые делают такое повторное использование/совместное использование сложными и не очень жизнеспособными.

В зависимости от того, что вы хотите достичь вы можете:

  • повторных использование элементы GUI - в этом случае раскатать YourOwnWidget : public QWidget, то вы можете создать экземпляр в стольких раз, сколько вы хотите

  • доли в одинаковые данные в нескольких элементах GUI, в дополнение к предыдущему шагу, то, что вы действительно хотите сделать, это поместить данные в отдельный, невидимый объект, тогда вы можете создавать и связывать столько типов и экземпляров элементов GUI, сколько это как хотите.

Смежные вопросы