Derrived Widget не центрируется на родительском элементе, когда отображается как диалог

У меня есть класс MyListWidget, полученный из QWidget. Я передал parent и flags в конструктор базового класса QWidget (в тестах пробовал и Qt :: Dialog, и Qt :: Popup), но пользовательский виджет отображается в центре экрана, а не по центру его родителя.

MyListWidget* myListWidget = new MyListWidget(this, Qt::Dialog);

Это конструктор:

MyListWidget::MyListWidget(QWidget* parent, Qt::WindowFlags flags)
: QWidget(parent, flags),
ui(std::auto_ptr<Ui::MyListWidget>(new Ui::MyListWidget))
{
ui->setupUi(this);
}

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

Упаковочные работы:

QDialog* popup = new QDialog(this, Qt::Popup);
QVBoxLayout* hLayout = new QVBoxLayout(popup);

// ... doing list creation like above

hLayout->addWidget(mmyListWidget);
popup->setLayout(hLayout);
const int width = mapListWidget->width();
const int height = mapListWidget->height();
popup->resize(width, height);

Есть идеи, что может произойти здесь?

1

Решение

QWidget по умолчанию не отображается в центре, поэтому вам нужно отцентрировать его вручную (вы можете сделать это в конструкторе):

MyListWidget::MyListWidget(QWidget* parent, Qt::WindowFlags flags)
: QWidget(parent, flags),
ui(std::auto_ptr<Ui::MyListWidget>(new Ui::MyListWidget))
{
ui->setupUi(this);
move(
parent->window()->frameGeometry().topLeft() +
parent->window()->rect().center() - rect().center()
);
}

Постскриптум Остерегаться std::auto_ptr, вы, вероятно, хотите использовать std::unique_ptr Эти дни.

5

Другие решения

Я не совсем уверен, чего вы пытаетесь достичь, но у меня есть ощущение, что вы должны извлечь MyListWidget из QDialog.

С Уважением,

Бен

1

По вопросам рекламы [email protected]