Question

I have a class MyListWidget derrived from QWidget. I passed parent and flags to the base class QWidget constructor (tried both Qt::Dialog and Qt::Popup in tests) but the custom widget is shown in the center of the screen instead centered to its parent.

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

This is the constructor:

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

If I put this widget into a separate dialog, anything works as expected. But why?

Wrapping works:

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);

Any ideas what could happend here?

Was it helpful?

Solution

QWidget is not shown on center by default, so you need to center it manually (you can do that in the constructor):

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()
    );
}

P.S. Beware of std::auto_ptr, you probably want to use std::unique_ptr these days.

OTHER TIPS

I'm not quite sure what you're trying to achieve but I have the feeling you should derive MyListWidget from QDialog.

Regards,

Ben

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top