windowflags: Allow testing of naked QWindows, not just QWidgets

Change-Id: Ia0eddcb385207ada8c3df59d49ff1de27a2aeb71
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Tor Arne Vestbø 2017-06-22 15:43:31 +02:00
parent f09f2f240f
commit 4ac47689fa
5 changed files with 93 additions and 45 deletions

View File

@ -59,24 +59,26 @@ ControllerWidget::ControllerWidget(QWidget *parent)
QLabel *label = new QLabel(tr("Parent window"));
parentWindow->setCentralWidget(label);
previewWindow = new PreviewWindow;
previewWindow = new QWindow;
previewWindow->installEventFilter(this);
previewWidget = new PreviewWidget;
previewWidget->installEventFilter(this);
previewDialog = new PreviewDialog;
previewDialog->installEventFilter(this);
createTypeGroupBox();
hintsControl = new HintControl;
hintsControl->setHints(previewWindow->windowFlags());
hintsControl->setHints(previewWidget->windowFlags());
connect(hintsControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(updatePreview()));
statesControl = new WindowStatesControl;
statesControl->setStates(previewWindow->windowState());
statesControl->setStates(previewWidget->windowState());
statesControl->setVisibleValue(true);
connect(statesControl, SIGNAL(changed()), this, SLOT(updatePreview()));
typeControl = new TypeControl;
typeControl->setType(previewWindow->windowFlags());
typeControl->setType(previewWidget->windowFlags());
connect(typeControl, SIGNAL(changed(Qt::WindowFlags)), this, SLOT(updatePreview()));
QVBoxLayout *mainLayout = new QVBoxLayout(this);
@ -98,61 +100,99 @@ bool ControllerWidget::eventFilter(QObject *, QEvent *e)
void ControllerWidget::updateStateControl()
{
if (previewWidget)
statesControl->setStates(previewWidget->windowState());
if (activePreview)
statesControl->setStates(activePreview->windowStates());
}
void ControllerWidget::updatePreview()
void ControllerWidget::updatePreview(QWindow *preview)
{
const Qt::WindowFlags flags = typeControl->type() | hintsControl->hints();
activePreview = preview;
if (previewWidgetButton->isChecked()) {
previewWidget = previewWindow;
previewDialog->hide();
} else {
previewWidget = previewDialog;
previewWindow->hide();
}
const Qt::WindowFlags flags = typeControl->type() | hintsControl->hints();
if (modalWindowCheckBox->isChecked()) {
parentWindow->show();
previewWidget->setWindowModality(Qt::WindowModal);
previewWidget->setParent(parentWindow);
preview->setModality(Qt::WindowModal);
preview->setParent(parentWindow->windowHandle());
} else {
previewWidget->setWindowModality(Qt::NonModal);
previewWidget->setParent(0);
preview->setModality(Qt::NonModal);
preview->setParent(0);
parentWindow->hide();
}
if (previewWidgetButton->isChecked())
previewWindow->setWindowFlags(flags);
else
previewDialog->setWindowFlags(flags);
preview->setFlags(flags);
if (fixedSizeWindowCheckBox->isChecked()) {
previewWidget->setFixedSize(300, 300);
preview->setMinimumSize(QSize(300, 300));
preview->setMaximumSize(QSize(300, 300));
} else {
previewWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
preview->setMinimumSize(QSize(0, 0));
preview->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
}
QPoint pos = previewWidget->pos();
preview->setWindowStates(statesControl->states());
preview->setVisible(statesControl->visibleValue());
}
void ControllerWidget::updatePreview(QWidget *preview)
{
activePreview = preview->windowHandle();
const Qt::WindowFlags flags = typeControl->type() | hintsControl->hints();
if (modalWindowCheckBox->isChecked()) {
parentWindow->show();
preview->setWindowModality(Qt::WindowModal);
preview->setParent(parentWindow);
} else {
preview->setWindowModality(Qt::NonModal);
preview->setParent(0);
parentWindow->hide();
}
preview->setWindowFlags(flags);
QSize fixedSize = fixedSizeWindowCheckBox->isChecked() ?
QSize(300, 300) : QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
preview->setFixedSize(fixedSize);
QPoint pos = preview->pos();
if (pos.x() < 0)
pos.setX(0);
if (pos.y() < 0)
pos.setY(0);
previewWidget->move(pos);
preview->move(pos);
previewWidget->setWindowState(statesControl->states());
previewWidget->setVisible(statesControl->visibleValue());
preview->setWindowState(statesControl->states());
preview->setVisible(statesControl->visibleValue());
}
void ControllerWidget::updatePreview()
{
if (previewWindowButton->isChecked()) {
previewDialog->hide();
previewWidget->close();
updatePreview(previewWindow);
} else if (previewWidgetButton->isChecked()) {
previewWindow->hide();
previewDialog->hide();
updatePreview(previewWidget);
} else {
previewWindow->hide();
previewWidget->close();
updatePreview(previewDialog);
}
}
void ControllerWidget::createTypeGroupBox()
{
widgetTypeGroupBox = new QGroupBox(tr("Widget Type"));
widgetTypeGroupBox = new QGroupBox(tr("Window Type"));
previewWindowButton = createRadioButton(tr("QWindow"));
previewWidgetButton = createRadioButton(tr("QWidget"));
previewWidgetButton->setChecked(true);
previewDialogButton = createRadioButton(tr("QDialog"));
previewWindowButton->setChecked(true);
QHBoxLayout *l = new QHBoxLayout;
l->addWidget(previewWindowButton);
l->addWidget(previewWidgetButton);
l->addWidget(previewDialogButton);
widgetTypeGroupBox->setLayout(l);

View File

@ -60,20 +60,27 @@ private slots:
void updateStateControl();
private:
void updatePreview(QWindow *);
void updatePreview(QWidget *);
void createTypeGroupBox();
QCheckBox *createCheckBox(const QString &text);
QRadioButton *createRadioButton(const QString &text);
QMainWindow *parentWindow;
PreviewWindow *previewWindow;
QWindow *previewWindow;
PreviewWidget *previewWidget;
PreviewDialog *previewDialog;
QWidget *previewWidget;
QWindow *activePreview;
QGroupBox *widgetTypeGroupBox;
QGroupBox *additionalOptionsGroupBox;
TypeControl *typeControl;
HintControl *hintsControl;
WindowStatesControl *statesControl;
QRadioButton *previewWindowButton;
QRadioButton *previewWidgetButton;
QRadioButton *previewDialogButton;
QCheckBox *modalWindowCheckBox;

View File

@ -43,5 +43,6 @@ int main(int argc, char *argv[])
if (!arguments.contains(QLatin1String("-e")))
controller.registerEventFilter();
controller.show();
controller.lower();
return app.exec();
}

View File

@ -172,37 +172,37 @@ static QPlainTextEdit *createControlPanel(QWidget *widget)
QGridLayout *buttonLayout = new QGridLayout;
bottomLayout->addStretch();
bottomLayout->addLayout(buttonLayout);
QPushButton *showNormalButton = new QPushButton(PreviewWindow::tr("Show normal"));
QPushButton *showNormalButton = new QPushButton(PreviewWidget::tr("Show normal"));
QObject::connect(showNormalButton, SIGNAL(clicked()), widget, SLOT(showNormal()));
buttonLayout->addWidget(showNormalButton, 0, 0);
QPushButton *showMinimizedButton = new QPushButton(PreviewWindow::tr("Show minimized"));
QPushButton *showMinimizedButton = new QPushButton(PreviewWidget::tr("Show minimized"));
QObject::connect(showMinimizedButton, SIGNAL(clicked()), widget, SLOT(showMinimized()));
buttonLayout->addWidget(showMinimizedButton, 0, 1);
QPushButton *showMaximizedButton = new QPushButton(PreviewWindow::tr("Show maximized"));
QPushButton *showMaximizedButton = new QPushButton(PreviewWidget::tr("Show maximized"));
QObject::connect(showMaximizedButton, SIGNAL(clicked()), widget, SLOT(showMaximized()));
buttonLayout->addWidget(showMaximizedButton, 0, 2);
QPushButton *showFullScreenButton = new QPushButton(PreviewWindow::tr("Show fullscreen"));
QPushButton *showFullScreenButton = new QPushButton(PreviewWidget::tr("Show fullscreen"));
QObject::connect(showFullScreenButton, SIGNAL(clicked()), widget, SLOT(showFullScreen()));
buttonLayout->addWidget(showFullScreenButton, 0, 3);
QPushButton *updateInfoButton = new QPushButton(PreviewWindow::tr("&Update Info"));
QPushButton *updateInfoButton = new QPushButton(PreviewWidget::tr("&Update Info"));
QObject::connect(updateInfoButton, SIGNAL(clicked()), widget, SLOT(updateInfo()));
buttonLayout->addWidget(updateInfoButton, 1, 0);
QPushButton *closeButton = new QPushButton(PreviewWindow::tr("&Close"));
QPushButton *closeButton = new QPushButton(PreviewWidget::tr("&Close"));
QObject::connect(closeButton, SIGNAL(clicked()), widget, SLOT(close()));
buttonLayout->addWidget(closeButton, 1, 3);
return textEdit;
}
PreviewWindow::PreviewWindow(QWidget *parent)
PreviewWidget::PreviewWidget(QWidget *parent)
: QWidget(parent)
{
textEdit = createControlPanel(this);
setWindowTitle(tr("Preview <QWidget> Qt %1").arg(QLatin1String(QT_VERSION_STR)));
}
bool PreviewWindow::event(QEvent *event)
bool PreviewWidget::event(QEvent *event)
{
const bool ret = QWidget::event(event);
@ -219,7 +219,7 @@ bool PreviewWindow::event(QEvent *event)
return ret;
}
void PreviewWindow::setWindowFlags(Qt::WindowFlags flags)
void PreviewWidget::setWindowFlags(Qt::WindowFlags flags)
{
if (flags == windowFlags())
return;
@ -227,7 +227,7 @@ void PreviewWindow::setWindowFlags(Qt::WindowFlags flags)
QTimer::singleShot(0, this, SLOT(updateInfo()));
}
void PreviewWindow::updateInfo()
void PreviewWidget::updateInfo()
{
textEdit->setPlainText(formatWidgetInfo(this));
}

View File

@ -35,12 +35,12 @@ QT_BEGIN_NAMESPACE
class QPlainTextEdit;
QT_END_NAMESPACE
class PreviewWindow : public QWidget
class PreviewWidget : public QWidget
{
Q_OBJECT
public:
PreviewWindow(QWidget *parent = 0);
PreviewWidget(QWidget *parent = 0);
void setWindowFlags(Qt::WindowFlags flags);