diff --git a/examples/opengl/hellogl2/mainwindow.cpp b/examples/opengl/hellogl2/mainwindow.cpp index 2416fd6057e..4ec8fcb8b10 100644 --- a/examples/opengl/hellogl2/mainwindow.cpp +++ b/examples/opengl/hellogl2/mainwindow.cpp @@ -3,19 +3,19 @@ #include "mainwindow.h" #include "window.h" +#include +#include #include #include #include MainWindow::MainWindow() { - QMenuBar *menuBar = new QMenuBar; - QMenu *menuWindow = menuBar->addMenu(tr("&Window")); - QAction *addNew = new QAction(menuWindow); - addNew->setText(tr("Add new")); - menuWindow->addAction(addNew); - connect(addNew, &QAction::triggered, this, &MainWindow::onAddNew); - setMenuBar(menuBar); + QMenu *menuWindow = menuBar()->addMenu(tr("&Window")); + menuWindow->addAction(tr("Add new"), QKeySequence(Qt::CTRL | Qt::Key_N), + this, &MainWindow::onAddNew); + menuWindow->addAction(tr("Quit"), QKeySequence(Qt::CTRL | Qt::Key_Q), + qApp, QApplication::closeAllWindows); onAddNew(); } @@ -25,6 +25,6 @@ void MainWindow::onAddNew() if (!centralWidget()) setCentralWidget(new Window(this)); else - QMessageBox::information(nullptr, tr("Cannot add new window"), + QMessageBox::information(this, tr("Cannot Add New Window"), tr("Already occupied. Undock first.")); } diff --git a/examples/opengl/hellogl2/window.cpp b/examples/opengl/hellogl2/window.cpp index 055dd5b5e37..2f9c33b24e0 100644 --- a/examples/opengl/hellogl2/window.cpp +++ b/examples/opengl/hellogl2/window.cpp @@ -28,22 +28,19 @@ Window::Window(MainWindow *mw) connect(zSlider, &QSlider::valueChanged, glWidget, &GLWidget::setZRotation); connect(glWidget, &GLWidget::zRotationChanged, zSlider, &QSlider::setValue); - QVBoxLayout *mainLayout = new QVBoxLayout; - QHBoxLayout *container = new QHBoxLayout; + QVBoxLayout *mainLayout = new QVBoxLayout(this); + QWidget *w = new QWidget; + QHBoxLayout *container = new QHBoxLayout(w); container->addWidget(glWidget); container->addWidget(xSlider); container->addWidget(ySlider); container->addWidget(zSlider); - QWidget *w = new QWidget; - w->setLayout(container); mainLayout->addWidget(w); dockBtn = new QPushButton(tr("Undock"), this); connect(dockBtn, &QPushButton::clicked, this, &Window::dockUndock); mainLayout->addWidget(dockBtn); - setLayout(mainLayout); - xSlider->setValue(15 * 16); ySlider->setValue(345 * 16); zSlider->setValue(0 * 16); @@ -64,7 +61,7 @@ QSlider *Window::createSlider() void Window::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Escape) + if (isWindow() && e->key() == Qt::Key_Escape) close(); else QWidget::keyPressEvent(e); @@ -72,26 +69,36 @@ void Window::keyPressEvent(QKeyEvent *e) void Window::dockUndock() { - if (parent()) { - setParent(nullptr); - setAttribute(Qt::WA_DeleteOnClose); - move(QGuiApplication::primaryScreen()->size().width() / 2 - width() / 2, - QGuiApplication::primaryScreen()->size().height() / 2 - height() / 2); - dockBtn->setText(tr("Dock")); - show(); - } else { - if (!mainWindow->centralWidget()) { - if (mainWindow->isVisible()) { - setAttribute(Qt::WA_DeleteOnClose, false); - dockBtn->setText(tr("Undock")); - mainWindow->setCentralWidget(this); - } else { - QMessageBox::information(nullptr, tr("Cannot dock"), - tr("Main window already closed")); - } - } else { - QMessageBox::information(nullptr, tr("Cannot dock"), - tr("Main window already occupied")); - } - } + if (parent()) + undock(); + else + dock(); +} + +void Window::dock() +{ + if (!mainWindow->isVisible()) { + QMessageBox::information(this, tr("Cannot Dock"), + tr("Main window already closed")); + return; + } + if (mainWindow->centralWidget()) { + QMessageBox::information(this, tr("Cannot Dock"), + tr("Main window already occupied")); + return; + } + setAttribute(Qt::WA_DeleteOnClose, false); + dockBtn->setText(tr("Undock")); + mainWindow->setCentralWidget(this); +} + +void Window::undock() +{ + setParent(nullptr); + setAttribute(Qt::WA_DeleteOnClose); + const auto geometry = screen()->availableGeometry(); + move(geometry.x() + (geometry.width() - width()) / 2, + geometry.y() + (geometry.height() - height()) / 2); + dockBtn->setText(tr("Dock")); + show(); } diff --git a/examples/opengl/hellogl2/window.h b/examples/opengl/hellogl2/window.h index 2099bc119ae..3fd64086ec7 100644 --- a/examples/opengl/hellogl2/window.h +++ b/examples/opengl/hellogl2/window.h @@ -26,6 +26,8 @@ private slots: void dockUndock(); private: + void dock(); + void undock(); QSlider *createSlider(); GLWidget *glWidget;