LINUX.ORG.RU

Тип layout-а в QMainWindow->layout()

 , ,


0

1

Если кратко, то я решил написать средней простенькости игру на Qt и поначалу для динамического добавления виджетов просто пихал их в layout основного окна:

    // Dynamically add widgets layer by layer
    this->layout()->addWidget(gameSingleton->getCamera());

    for(auto widget : gameSingleton->getBackgroundWidgets()){
         this->layout()->addWidget(widget);
    }

    for(auto widget : gameSingleton->getForegroundWidgets()){
         this->layout()->addWidget(widget);
    }

Это вызывало предупреждения при запуске, да и я сам решил переделать это дело таким образом, чтобы я мог передавать виджет, к которому будет прикреплен интерфейс, по указателю. И тут начинается самое интересное. У базового centralWidget-а создаваемого в gamewindow.ui layout не задан, нижеприведенный код сегфолтится:

    // Dynamically add widgets layer by layer
this->centralWidget()->layout()->addWidget(gameSingleton->getCamera());

    for(auto widget : gameSingleton->getBackgroundWidgets()){
         this->centralWidget()->layout()->addWidget(widget);
    }

    for(auto widget : gameSingleton->getForegroundWidgets()){
         this->centralWidget()->layout()->addWidget(widget);
    }

Если затать ему layout или свой центральный виджет, то ни QHBoxLayout,ни QStackedLayout, ни QGridLayout не соответствуют тому, что ранее был в QMainWindow, либо перемешивая все виджеты в соответствии со своим шаблоном, либо ставя один из них поверх остальных.

Меня интересует, есть ли в Qt потомок QLayout который бы просто расставлял помещенные в него виджеты по своим координатам, не группируя их в клетки, колонны и прочего ненужного мне функционала? В идеале бы именно тот, который используется в QMainWindow.



Последнее исправление: le_poisson (всего исправлений: 1)

Меня интересует, есть ли в Qt потомок QLayout который бы просто расставлял помещенные в него виджеты по своим координатам, не группируя их в клетки, колонны и прочего ненужного мне функционала?

Смысл QLayout в том, чтобы автоматически рассчитывать координаты для виджетов по заданным правилам. Если координаты известны, QLayout не нужен, так как ты можешь задать координаты виджетам напрямую. Но мне что-то подсказывает, что ты пытаешься сделать ересь, и для твоей задачи на самом деле нужно использовать QGraphicsView или что-то в таком духе.

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от annulen

Так я и использую, но только для самой игры. Пока что виджеты в для кнопок и декораций интерфейса. Спрайты и маркеры перемещаются относительно камеры, кнопки и интерфейс - нет, и по-хорошему должны прорисовываться поверх, поэтому я и вынес их в отдельные виджеты.

le_poisson
() автор топика
Ответ на: комментарий от le_poisson

И я знаю про setZValue(), но привязки к координатам сцены, а не экрана, это не отменяет.

le_poisson
() автор топика
Ответ на: комментарий от annulen

И еще, как добавить виджет внутрь другого виджета не через layout()->addWidget(), предварительно явно задав этот самый layout?

le_poisson
() автор топика
Ответ на: комментарий от le_poisson

Спрайты и маркеры перемещаются относительно камеры

Вот это не должно быть виджетами ни в коем случае

кнопки и интерфейс - нет, и по-хорошему должны прорисовываться поверх

это может быть виджетами.

И я знаю про setZValue()

А про QWidget::setGeometry() знаешь?

annulen ★★★★★
()
Ответ на: комментарий от le_poisson

как добавить виджет внутрь другого виджета не через layout

Создать его, передав в конструктор родительский виджет в качестве parent’а

annulen ★★★★★
()
Ответ на: комментарий от annulen

Вот это не должно быть виджетами ни в коем случае это может быть виджетами. В общем, так все пока и обстоит.

Создать его, передав в конструктор родительский виджет в качестве parent’а

Хорошо, попробую.

le_poisson
() автор топика
Ответ на: комментарий от le_poisson

Вот это не должно быть виджетами ни в коем случае

это может быть виджетами.

В общем, так все пока и обстоит.

le_poisson
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.