2016-04-11 1 views
1

Я создал макет , содержащий родительский виджет. В этом родительском виджета я создал еще один виджет.Детский виджет центра в родительском виджетах (родительский виджет был добавлен в макет)

Мой код подобно этому:

QGridLayout *layout = new QGridLayout(); 
QWidget *parentWidget = new QWidget(); 
layout->addWidget(parentWidget); 
QWidget *childWidget = new QWidget(parentWidget); 

enter image description here

Как я могу центрирование дочернего виджета в родительском виджете?

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

ответ

2

Переместить ребенка в родительский showeEvent. Вы можете использовать флаг bool, чтобы сделать это, только когда родительский указатель показан в первый раз.

void Parent::showEvent(QShowEvent *) 
{ 
    if(_first_show) 
    { 
     _first_show = false; 
     _child->move(this->rect().center() - _child->rect().center()); 
    } 
} 

Доказательство того, что он работает (красный родитель, и синий ребенок):

enter image description here

+0

Спасибо, что терпеливы со мной. Могу я спросить вас еще об одном? Если я следую этому методу, мне нужно будет создать класс для родительского виджета правильно? – user2652023

+1

@ user2652023 Было бы идеально, но вам не придется. Вы можете использовать [фильтр событий] (http://doc.qt.io/qt-5/eventsandfilters.html#event-filters), но это просто приведет к уродливому коду. – thuga

2

Вы можете сделать это, установив фиксированный размер дочернего виджета и разместив его внутри сетки макета родительского виджета.

QGridLayout *layout = new QGridLayout(); 
QWidget *parentWidget = new QWidget(); 
layout->addWidget(parentWidget); 
QWidget *childWidget = new QWidget(parentWidget); 
QGridLayout *parentLayout = new QGridLayout(); 
parentWidget->setLayout(parentLayout); 
parentLayout->addWidget(childWidget); 
childWidget->setFixedSize(/*some fixed size for child widget*/); 
+0

как я могу переместить дочерний виджет в центр с setFixedSize()? Спасибо – user2652023

+0

@ user2652023, Grid layout размещает виджет в центре его ячейки, но если вы не зададите фиксированный размер, дочерний виджет будет иметь тот же размер, что и родительский (минус поля) –

+0

Это моя цель, я хочу, чтобы родитель виджет больше дочернего виджета, мой код выше просто используется, чтобы проиллюстрировать мою идею. Изображение - это реальный интерфейс, я хочу – user2652023