30 #include "private/qmdisubwindow_p.h"
36 #include <QMainWindow>
42 #include <QHBoxLayout>
45 #include <QStyleOptionTitleBar>
46 #include <QPushButton>
56 static inline bool tabAllWidgets()
58 #if !defined(Q_OS_WIN)
133 static const Qt::WindowFlags StandardWindowFlags
135 static const Qt::WindowFlags DialogWindowFlags
176 void minimumSizeHint();
179 void setWindowState_data();
180 void setWindowState();
181 void mainWindowSupport();
182 void emittingOfSignals_data();
183 void emittingOfSignals();
185 void showNormal_data();
188 void setOpaqueResizeAndMove_data();
189 void setOpaqueResizeAndMove();
191 void setWindowFlags_data();
192 void setWindowFlags();
193 void mouseDoubleClick();
194 void setSystemMenu();
196 void restoreFocusOverCreation();
197 void changeFocusWithTab();
199 void setWindowTitle();
200 void resizeEvents_data();
202 #if defined(Q_OS_MAC)
203 void defaultSizeGrip();
206 void keepWindowMaximizedState();
207 void explicitlyHiddenWidget();
209 void fixedMinMaxSize();
210 #if !defined (Q_OS_DARWIN)
211 void replaceMenuBarWhileMaximized();
212 void closeOnDoubleClick_data();
213 void closeOnDoubleClick();
222 void testFullScreenState();
223 void testRemoveBaseWidget();
226 void tst_QMdiSubWindow::initTestCase()
229 QSKIP(
"Wayland: Almost all of these fail. Figure out why.");
231 qRegisterMetaType<Qt::WindowStates>(
"Qt::WindowStates");
237 void tst_QMdiSubWindow::cleanup()
242 void tst_QMdiSubWindow::sizeHint()
254 void tst_QMdiSubWindow::minimumSizeHint()
261 QSize minimumSizeHint()
const override
263 return QSize(100, 100);
285 void tst_QMdiSubWindow::minimumSize()
289 mdiArea.resize(200, 200);
302 QVERIFY(subWindow2->
size() != mdiArea.viewport()->size());
306 void tst_QMdiSubWindow::setWidget()
328 window.setWidget(
nullptr);
345 void tst_QMdiSubWindow::setWindowState_data()
347 QTest::addColumn<Qt::WindowState>(
"windowState");
354 void tst_QMdiSubWindow::setWindowState()
365 for (
int iteration = 0; iteration < 2; ++iteration) {
369 testWidget =
window->widget();
373 Qt::WindowStates windowStateWindow =
window->windowState();
375 Qt::WindowStates windowStateWidget =
window->widget()->windowState();
377 QCOMPARE(windowStateWindow, windowStateWidget);
379 switch (windowState) {
400 void tst_QMdiSubWindow::mainWindowSupport()
409 bool nativeMenuBar =
mainWindow.menuBar()->isNativeMenuBar();
413 if (!nativeMenuBar) {
417 window->setWindowTitle(expectedTitle);
432 for (
int i = 0;
i < 5; ++
i) {
441 window->setWidget(nestedWorkspace);
463 if (!nativeMenuBar) {
475 nestedWorkspace->show();
486 if (!nativeMenuBar) {
488 .
arg(originalWindowTitle,
window->widget()->windowTitle()));
506 .
arg(originalWindowTitle,
window->widget()->windowTitle()));
513 void tst_QMdiSubWindow::emittingOfSignals_data()
515 QTest::addColumn<QByteArray>(
"signal");
516 QTest::addColumn<Qt::WindowState>(
"watchedState");
526 void tst_QMdiSubWindow::emittingOfSignals()
544 :
SIGNAL(windowStateChanged(Qt::WindowStates,Qt::WindowStates)));
557 Qt::WindowStates oldState = qvariant_cast<Qt::WindowStates>(
spy.
at(
i).
at(0));
558 Qt::WindowStates
newState = qvariant_cast<Qt::WindowStates>(
spy.
at(
i).
at(1));
560 if (!(oldState & watchedState) && (
newState & watchedState))
572 window->setParent(
nullptr);
585 void tst_QMdiSubWindow::showShaded()
627 const QSize minimumSizeHint =
window->minimumSizeHint();
629 const int maxHeightDiff = 300 - minimumSizeHint.
height();
635 QWidget *mouseReceiver =
nullptr;
637 if (
window->style()->inherits(
"QMacStyle"))
643 sendMouseMove(mouseReceiver, mousePosition,
Qt::NoButton);
644 sendMousePress(mouseReceiver, mousePosition);
646 for (
int i = 0;
i < maxHeightDiff + 20; ++
i) {
647 --mousePosition.ry();
648 sendMouseMove(mouseReceiver, mousePosition);
651 sendMouseRelease(mouseReceiver, mousePosition);
656 window->setParent(
nullptr);
663 void tst_QMdiSubWindow::showNormal_data()
665 QTest::addColumn<QByteArray>(
"slot");
672 void tst_QMdiSubWindow::showNormal()
699 object->installEventFilter(
this);
708 if (
event->type() == eventToSpy)
719 void tst_QMdiSubWindow::setOpaqueResizeAndMove_data()
721 QTest::addColumn<bool>(
"opaqueMode");
722 QTest::addColumn<int>(
"geometryCount");
723 QTest::addColumn<int>(
"expectedGeometryCount");
724 QTest::addColumn<QSize>(
"workspaceSize");
725 QTest::addColumn<QSize>(
"windowSize");
731 void tst_QMdiSubWindow::setOpaqueResizeAndMove()
734 QFETCH(
int, geometryCount);
735 QFETCH(
int, expectedGeometryCount);
748 QWidget *mouseReceiver =
nullptr;
749 if (
window->style()->inherits(
"QMacStyle"))
777 sendMouseMove(mouseReceiver, mousePosition,
Qt::NoButton);
778 sendMousePress(mouseReceiver, mousePosition);
787 for (
int i = 0;
i < geometryCount; ++
i) {
788 if (mouseReceiver ==
window) {
789 ++mousePosition.rx();
790 ++mousePosition.ry();
791 sendMouseMove(mouseReceiver, mousePosition);
793 sendMouseMove(mouseReceiver, mousePosition +
QPoint(1, 1));
798 sendMouseRelease(mouseReceiver, mousePosition);
799 QCOMPARE(resizeSpy.count(), expectedGeometryCount);
819 #if defined(Q_OS_MAC)
825 sendMousePress(
window, mousePosition);
828 for (
int i = 0;
i < geometryCount; ++
i) {
829 ++mousePosition.rx();
830 ++mousePosition.ry();
831 sendMouseMove(
window, mousePosition);
835 sendMouseRelease(
window, mousePosition);
836 QCOMPARE(moveSpy.count(), expectedGeometryCount);
842 void tst_QMdiSubWindow::setWindowFlags_data()
844 QTest::addColumn<Qt::WindowType>(
"windowType");
845 QTest::addColumn<Qt::WindowType>(
"expectedWindowType");
846 QTest::addColumn<Qt::WindowFlags>(
"customFlags");
847 QTest::addColumn<Qt::WindowFlags>(
"expectedCustomFlags");
854 << Qt::WindowFlags{} << StandardWindowFlags;
856 << Qt::WindowFlags{} << StandardWindowFlags;
858 << Qt::WindowFlags{} << DialogWindowFlags;
860 << Qt::WindowFlags{} << StandardWindowFlags;
862 << Qt::WindowFlags{} << StandardWindowFlags;
864 << Qt::WindowFlags{} << StandardWindowFlags;
866 << Qt::WindowFlags{} << StandardWindowFlags;
868 << Qt::WindowFlags{} << StandardWindowFlags;
870 << Qt::WindowFlags{} << StandardWindowFlags;
872 << Qt::WindowFlags{} << StandardWindowFlags;
874 << Qt::WindowFlags{} << StandardWindowFlags;
879 << Qt::WindowFlags{};
882 << Qt::WindowFlags{};
885 << Qt::WindowFlags{};
888 << Qt::WindowFlags{};
890 << StandardWindowFlags
891 << Qt::WindowFlags{};
894 << Qt::WindowFlags{};
897 << Qt::WindowFlags{};
900 << Qt::WindowFlags{};
913 << Qt::WindowFlags{};
919 << Qt::WindowFlags{};
925 << Qt::WindowFlags{};
928 << Qt::WindowFlags{};
931 void tst_QMdiSubWindow::setWindowFlags()
935 QFETCH(Qt::WindowFlags, customFlags);
936 QFETCH(Qt::WindowFlags, expectedCustomFlags);
947 window->setWindowFlags(windowType | customFlags);
950 if (!expectedCustomFlags)
951 QCOMPARE(
window->windowFlags() & ~expectedWindowType, customFlags);
953 QCOMPARE(
window->windowFlags() & ~expectedWindowType, expectedCustomFlags);
956 void tst_QMdiSubWindow::mouseDoubleClick()
981 sendMouseDoubleClick(
window, mousePosition);
985 sendMouseDoubleClick(
window, mousePosition);
993 originalGeometry =
window->geometry();
994 sendMouseDoubleClick(
window, mousePosition);
998 sendMouseDoubleClick(
window, mousePosition);
1005 sendMouseDoubleClick(
window, mousePosition);
1010 void tst_QMdiSubWindow::setSystemMenu()
1013 subWindow->
resize(200, 50);
1023 mainWindow.menuBar()->setNativeMenuBar(
false);
1036 subWindow->showSystemMenu();
1045 subWindow->setSystemMenu(systemMenu);
1047 subWindow->setSystemMenu(
nullptr);
1050 systemMenu =
new QMenu(subWindow);
1053 subWindow->setSystemMenu(systemMenu);
1054 QCOMPARE(subWindow->systemMenu(), qobject_cast<QMenu *>(systemMenu));
1060 subWindow->showSystemMenu();
1067 #if !defined (Q_OS_DARWIN)
1073 subWindow->showSystemMenu();
1089 subWindow->showSystemMenu();
1099 #if !defined (Q_OS_DARWIN)
1105 subWindow->showSystemMenu();
1114 QVERIFY(!subWindow->systemMenu());
1117 void tst_QMdiSubWindow::restoreFocus()
1121 box->setCheckable(
true);
1138 for (
int i = 0;
i < 4; ++
i)
1236 void tst_QMdiSubWindow::restoreFocusOverCreation()
1241 mdiArea.resize(800, 800);
1243 mdiArea.setWindowTitle(
QStringLiteral(
"restoreFocusOverCreation"));
1264 void tst_QMdiSubWindow::changeFocusWithTab()
1329 bool acceptClose =
false;
1332 void tst_QMdiSubWindow::closeEvent()
1368 void tst_QMdiSubWindow::setWindowTitle()
1388 textEdit->setWindowModified(
false);
1397 textEdit->setWindowModified(
true);;
1398 expectedWindowTitle =
QLatin1String(
"Override child title");
1399 window->setWindowTitle(expectedWindowTitle);
1406 textEdit->setWindowModified(
false);
1410 window->setWindowModified(
false);
1415 expectedWindowTitle =
QLatin1String(
"My parent doesn't have any title so now I can set one[*]");
1421 window->setWidget(
nullptr);
1427 void tst_QMdiSubWindow::resizeEvents_data()
1429 QTest::addColumn<Qt::WindowState>(
"windowState");
1430 QTest::addColumn<int>(
"expectedWindowResizeEvents");
1431 QTest::addColumn<int>(
"expectedWidgetResizeEvents");
1432 QTest::addColumn<bool>(
"isShadeMode");
1439 void tst_QMdiSubWindow::resizeEvents()
1442 QFETCH(
int, expectedWindowResizeEvents);
1443 QFETCH(
int, expectedWidgetResizeEvents);
1444 QFETCH(
bool, isShadeMode);
1458 QCOMPARE(windowResizeEventSpy.count(), 0);
1460 QCOMPARE(widgetResizeEventSpy.count(), 0);
1464 window->setWindowState(windowState);
1473 QCOMPARE(windowResizeEventSpy.count(), expectedWindowResizeEvents);
1474 QCOMPARE(widgetResizeEventSpy.count(), expectedWidgetResizeEvents);
1475 windowResizeEventSpy.clear();
1476 widgetResizeEventSpy.clear();
1486 QCOMPARE(windowResizeEventSpy.count(), expectedWindowResizeEvents);
1487 QCOMPARE(widgetResizeEventSpy.count(), expectedWidgetResizeEvents);
1490 #if defined(Q_OS_MAC)
1491 void tst_QMdiSubWindow::defaultSizeGrip()
1493 if (!
qApp->style()->inherits(
"QMacStyle"))
1500 windowWithDecoration->
show();
1505 windowWithoutDecoration->
show();
1510 void tst_QMdiSubWindow::hideAndShow()
1531 #if !defined (Q_OS_DARWIN)
1546 #if !defined (Q_OS_DARWIN)
1557 for (
int i = 0;
i < 5; ++
i)
1568 #if !defined (Q_OS_DARWIN)
1594 #if !defined (Q_OS_DARWIN)
1608 #if !defined (Q_OS_DARWIN)
1615 void tst_QMdiSubWindow::keepWindowMaximizedState()
1628 subWindow->
move(newPosition);
1634 subWindow->
resize(newSize);
1653 void tst_QMdiSubWindow::explicitlyHiddenWidget()
1705 void tst_QMdiSubWindow::resizeTimer()
1714 QCOMPARE(timerEventSpy.count(), 0);
1716 for (
int i = 0;
i < 20; ++
i) {
1726 void tst_QMdiSubWindow::fixedMinMaxSize()
1730 mdiArea.setGeometry(0, 0, 640, 480);
1752 minimizedHeight += 8;
1755 const QSize minimizedSize =
QSize(minimizedWidth, minimizedHeight);
1781 #if !defined( Q_OS_DARWIN)
1782 void tst_QMdiSubWindow::replaceMenuBarWhileMaximized()
1808 menuBar2->setNativeMenuBar(
false);
1852 void tst_QMdiSubWindow::closeOnDoubleClick_data()
1854 QTest::addColumn<int>(
"actionIndex");
1855 QTest::addColumn<bool>(
"expectClosed");
1861 void tst_QMdiSubWindow::closeOnDoubleClick()
1863 QFETCH(
int, actionIndex);
1864 QFETCH(
bool, expectClosed);
1873 subWindow->showSystemMenu();
1876 QTRY_VERIFY( (systemMenu = subWindow->systemMenu()) );
1880 sendMouseDoubleClick(systemMenu, actionGeometry.
center());
1889 void tst_QMdiSubWindow::setFont()
1891 QSKIP(
"This test function is unstable in CI, please see QTBUG-22544");
1895 subWindow->
resize(300, 100);
1905 const QRect titleBarRect =
QRect(0, 0, subWindow->
width(), titleBarHeight);
1909 newFont.setBold(
true);
1912 const QFont &swFont = subWindow->
font();
1917 QVERIFY(newTitleBar != originalTitleBar);
1919 subWindow->
setFont(originalFont);
1922 newTitleBar = subWindow->
grab(titleBarRect).
toImage();
1923 QCOMPARE(newTitleBar, originalTitleBar);
1926 void tst_QMdiSubWindow::task_188849()
1945 void tst_QMdiSubWindow::mdiArea()
1956 mdiArea.setCornerWidget(
new QWidget);
1957 subWindow->
setParent(mdiArea.cornerWidget());
1965 nestedArea->setViewport(
new QWidget);
1969 void tst_QMdiSubWindow::task_182852()
1987 window->setWidget(nestedWorkspace);
1997 .
arg(originalWindowTitle,
window->widget()->windowTitle()));
2014 .
arg(originalWindowTitle,
window->widget()->windowTitle()));
2017 void tst_QMdiSubWindow::task_233197()
2047 focus1->
move(5, 30);
2053 focus2->
move(5, 60);
2063 sendMousePress(focus2,
QPoint());
2064 sendMouseRelease(focus2,
QPoint());
2066 sendMousePress(focus1,
QPoint());
2067 sendMouseRelease(focus1,
QPoint());
2069 sendMousePress(focus2,
QPoint());
2070 sendMouseRelease(focus2,
QPoint());
2072 sendMousePress(close,
QPoint());
2073 sendMouseRelease(close,
QPoint());
2078 void tst_QMdiSubWindow::task_226929()
2100 void tst_QMdiSubWindow::styleChange()
2117 qRegisterMetaType<QMdiSubWindow *>();
2130 void tst_QMdiSubWindow::testFullScreenState()
2134 mdiArea.showMaximized();
2144 void tst_QMdiSubWindow::testRemoveBaseWidget()
2167 #include "tst_qmdisubwindow.moc"
small capitals from c petite p scientific i
[1]
EventSpy(QObject *object, QEvent::Type event)
bool eventFilter(QObject *object, QEvent *event) override
Q_DISABLE_COPY(LayoutDirectionGuard)
LayoutDirectionGuard()=default
A simple QTextEdit which can switch between two different size states.
void closeEvent(QCloseEvent *closeEvent) override
void setAcceptClose(bool enable=true)
static QWidget * focusWidget()
static QWidgetList topLevelWidgets()
static void setEffectEnabled(Qt::UIEffect, bool enable=true)
static QWidget * activePopupWidget()
static void setActiveWindow(QWidget *act)
void addWidget(QWidget *, int stretch=0, Qt::Alignment alignment=Qt::Alignment())
The QByteArray class provides an array of bytes.
The QCloseEvent class contains parameters that describe a close event.
static bool sendEvent(QObject *receiver, QEvent *event)
static void processEvents(QEventLoop::ProcessEventsFlags flags=QEventLoop::AllEvents)
The QEvent class is the base class of all event classes. Event objects contain event parameters.
The QFont class specifies a query for a font used for drawing text.
The QGridLayout class lays out widgets in a grid.
The QGroupBox widget provides a group box frame with a title.
QScreen * primaryScreen
the primary (or default) screen of the application.
static void setLayoutDirection(Qt::LayoutDirection direction)
QString platformName
The name of the underlying platform plugin.
static QList< QScreen * > screens()
The QHBoxLayout class lines up widgets horizontally.
The QIcon class provides scalable icons in different modes and states.
The QImage class provides a hardware-independent image representation that allows direct access to th...
The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal.
void addWidget(QWidget *w)
The QLineEdit widget is a one-line text editor.
bool isEmpty() const noexcept
const_reference at(qsizetype i) const noexcept
qsizetype count() const noexcept
void append(parameter_type t)
The QMainWindow class provides a main application window.\inmodule QtWidgets.
The QMdiArea widget provides an area in which MDI windows are displayed.
QMdiSubWindow * addSubWindow(QWidget *widget, Qt::WindowFlags flags=Qt::WindowFlags())
QMdiSubWindow * activeSubWindow() const
void setOption(AreaOption option, bool on=true)
void subWindowActivated(QMdiSubWindow *)
void removeSubWindow(QWidget *widget)
QList< QMdiSubWindow * > subWindowList(WindowOrder order=CreationOrder) const
@ DontMaximizeSubWindowOnActivation
void setActiveSubWindow(QMdiSubWindow *window)
The QMdiSubWindow class provides a subwindow class for QMdiArea.
QSize minimumSizeHint() const override
QWidget * maximizedSystemMenuIconWidget() const
QWidget * maximizedButtonsWidget() const
QMdiArea * mdiArea() const
void setWidget(QWidget *widget)
The QMouseEvent class contains parameters that describe a mouse event.
The QObject class is the base class of all Qt objects.
T findChild(const QString &aName=QString(), Qt::FindChildOptions options=Qt::FindChildrenRecursively) const
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
virtual bool event(QEvent *event)
virtual bool eventFilter(QObject *watched, QEvent *event)
The QPoint class defines a point in the plane using integer precision.
The QRect class defines a rectangle in the plane using integer precision.
constexpr QPoint topLeft() const noexcept
constexpr QPoint topRight() const noexcept
bool contains(const QRect &r, bool proper=false) const noexcept
constexpr QPoint center() const noexcept
The QSizeGrip class provides a resize handle for resizing top-level windows.
The QSize class defines the size of a two-dimensional object using integer point precision.
constexpr int height() const noexcept
constexpr int width() const noexcept
The QString class provides a Unicode character string.
static QString fromLatin1(QByteArrayView ba)
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=QLatin1Char(' ')) const
static QString number(int, int base=10)
virtual QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option=nullptr, const QWidget *widget=nullptr) const =0
virtual int styleHint(StyleHint stylehint, const QStyleOption *opt=nullptr, const QWidget *widget=nullptr, QStyleHintReturn *returnData=nullptr) const =0
@ PM_MdiSubWindowFrameWidth
@ PM_MdiSubWindowMinimizedWidth
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option=nullptr, const QWidget *widget=nullptr) const =0
void initFrom(const QWidget *w)
the position of the selected tab in relation to this tab
The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
QTextEdit(QWidget *parent=nullptr)
The QVBoxLayout class lines up widgets vertically.
QSignalSpy spy(myCustomObject, SIGNAL(mySignal(int, QString, double)))
[0]
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
JDIMENSION DCTELEM * workspace
QList< QWindow * > windows
Q_TESTLIB_EXPORT QTestData & newRow(const char *dataTag)
Q_TESTLIB_EXPORT const char * currentTestFunction()
Q_GUI_EXPORT bool qWaitForWindowActive(QWindow *window, int timeout=5000)
Q_GUI_EXPORT bool qWaitForWindowExposed(QWindow *window, int timeout=5000)
Q_TESTLIB_EXPORT void ignoreMessage(QtMsgType type, const char *message)
Q_TESTLIB_EXPORT const char * currentDataTag()
Q_CORE_EXPORT void qWait(int ms)
QTextStream & center(QTextStream &stream)
@ WindowContextHelpButtonHint
@ WindowMaximizeButtonHint
@ WindowMinimizeButtonHint
@ WindowMinMaxButtonsHint
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QByteArrayView haystack, QByteArrayView needle) noexcept
MyMainWidget * mainWindow
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei count
GLenum GLuint GLintptr offset
#define QStringLiteral(str)
#define QTEST_MAIN(TestObject)
#define QSKIP(statement,...)
#define QFETCH(Type, name)
#define QTRY_COMPARE(expr, expected)
#define QVERIFY(statement)
#define QTRY_VERIFY(expr)
QGraphicsWidget * textEdit
The QLatin1Char class provides an 8-bit ASCII/Latin-1 character.
QT_BEGIN_NAMESPACE bool qt_tab_all_widgets()
Q_DECLARE_METATYPE(Qt::WindowState)