hellogl2 example: Streamline code
- Shorten menu code, add keyboard shortcuts and a quit action. - Avoid calls to setLayout(). - Pass a parent to message boxes. - Use the current screen for size calculation and consider availableGeometry(). - Prevent closing by the Escape key in docked mode. - Split the dockUndock() function into dock()/undock() for clarity Change-Id: I007da3bff86ee3f2dc8f87379e5d2ba2f0f6f3d7 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> (cherry picked from commit 6f8398c8eb5476a6e98126d5b63421896b874271) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 734db610c3db3f00775d518b63d94695a2654389)
This commit is contained in:
parent
de59f732fc
commit
ccfd8acd4b
@ -3,19 +3,19 @@
|
||||
|
||||
#include "mainwindow.h"
|
||||
#include "window.h"
|
||||
#include <QApplication>
|
||||
#include <QKeySequence>
|
||||
#include <QMenuBar>
|
||||
#include <QMenu>
|
||||
#include <QMessageBox>
|
||||
|
||||
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."));
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -26,6 +26,8 @@ private slots:
|
||||
void dockUndock();
|
||||
|
||||
private:
|
||||
void dock();
|
||||
void undock();
|
||||
QSlider *createSlider();
|
||||
|
||||
GLWidget *glWidget;
|
||||
|
Loading…
x
Reference in New Issue
Block a user