Как заставить QWidget показываться в отдельном окне? - PullRequest
6 голосов
/ 04 марта 2011

У меня есть

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget (QWidget *parent);
    // ...
};

// here is ALL the code in MyWidget constructor
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    glWidget = new GLWidget(this, cluster);

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(glWidget);
    setLayout(mainLayout);

    setWindowTitle("Visualization");
}

и главное окно MainWindow w;.

Я хочу

  1. для создания новых экземпляров MyWidget из w;
  2. , которые должны быть уничтожены после QCloseEvent или с w (теперь они уничтожаются только после QCloseEvent);
  3. , чтобы экземпляры появлялись в новых окнах.

Я создаю новый экземпляр MyWidget следующим образом:

void MainWindow::visualize()
{
    MyWidget *widg = new MyWidget(this); // or widg = new MyWidget(0)
    widg->show();
    widg->raise();
    widg->activateWindow();
}

Когда я пытаюсь создать widg с w, как parent, widg появляется внутриw (в левом верхнем углу).

Какой самый простой и понятный способ исправить это?

Спасибо!

Ответы [ 2 ]

11 голосов
/ 06 марта 2011
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent, Qt::Window)
{
    glWidget = new GLWidget(this, cluster);

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(glWidget);
    setLayout(mainLayout);

    setWindowTitle("Visualization");
}

Добавление Qt::Window в конструктор QWidget должно делать то, что вы хотите.

2 голосов
/ 06 марта 2011

Как написано в Ссылка на конструктор QWidget , чтобы виджет стал окном, его родитель должен быть 0. Но когда родитель равен 0, это означает, что родитель - "ВЫ" :) - т.е.присматривать за ними - держать их в каком-то доступном месте и уничтожать их, когда уместно время (либо на событии close, либо на деструкторе, либо с помощью общих указателей).

...