Fix QGuiApplication::topLevelWindows(), introducing allWindows()

As discussed on the development mailing list, the window list returned
by QGuiApplication::topLevellWindows() included all QWindows, even the
non top-level ones.
This commit introduces the new method allWindows(), which returns the list
of all QWindows, fixes the list returned by topLevelWindows() and also
introduces tests for both methods.

Change-Id: I761f0fcdec79f83949012c628655ed12cd18572c
Reviewed-by: Jonas Gastal <jgastal@profusion.mobi>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
This commit is contained in:
Anselmo L. S. Melo 2012-01-27 07:49:34 -03:00 committed by Qt by Nokia
parent e8105e4783
commit 8839a0a001
3 changed files with 65 additions and 1 deletions

View File

@ -214,11 +214,38 @@ QObject *QGuiApplication::focusObject()
return 0;
}
QWindowList QGuiApplication::topLevelWindows()
/*!
\fn QGuiApplication::allWindows()
Returns a list of all the windows in the application.
The list is empty if there are no windows.
\sa topLevelWindows()
*/
QWindowList QGuiApplication::allWindows()
{
return QGuiApplicationPrivate::window_list;
}
/*!
\fn QGuiApplication::topLevelWindows()
Returns a list of the top-level windows in the application.
\sa allWindows()
*/
QWindowList QGuiApplication::topLevelWindows()
{
const QWindowList &list = QGuiApplicationPrivate::window_list;
QWindowList topLevelWindows;
for (int i = 0; i < list.size(); i++) {
if (!list.at(i)->parent())
topLevelWindows.prepend(list.at(i));
}
return topLevelWindows;
}
QScreen *QGuiApplication::primaryScreen()
{
if (QGuiApplicationPrivate::screen_list.isEmpty())

View File

@ -81,6 +81,7 @@ public:
QGuiApplication(int &argc, char **argv, int = ApplicationFlags);
virtual ~QGuiApplication();
static QWindowList allWindows();
static QWindowList topLevelWindows();
static QWindow *topLevelAt(const QPoint &pos);

View File

@ -42,6 +42,7 @@
#include <QtTest/QtTest>
#include <QtGui/QGuiApplication>
#include <QtGui/QWindow>
#include <QDebug>
class tst_QGuiApplication: public QObject
@ -50,6 +51,8 @@ class tst_QGuiApplication: public QObject
private slots:
void focusObject();
void allWindows();
void topLevelWindows();
};
class DummyWindow : public QWindow
@ -115,6 +118,39 @@ void tst_QGuiApplication::focusObject()
QCOMPARE(app.focusObject(), &obj3);
}
void tst_QGuiApplication::allWindows()
{
int argc = 0;
QGuiApplication app(argc, 0);
QWindow *window1 = new QWindow;
QWindow *window2 = new QWindow(window1);
QVERIFY(app.allWindows().contains(window1));
QVERIFY(app.allWindows().contains(window2));
QCOMPARE(app.allWindows().count(), 2);
delete window1;
window1 = 0;
window2 = 0;
QVERIFY(!app.allWindows().contains(window2));
QVERIFY(!app.allWindows().contains(window1));
QCOMPARE(app.allWindows().count(), 0);
}
void tst_QGuiApplication::topLevelWindows()
{
int argc = 0;
QGuiApplication app(argc, 0);
QWindow *window1 = new QWindow;
QWindow *window2 = new QWindow(window1);
QVERIFY(app.topLevelWindows().contains(window1));
QVERIFY(!app.topLevelWindows().contains(window2));
QCOMPARE(app.topLevelWindows().count(), 1);
delete window1;
window1 = 0;
window2 = 0;
QVERIFY(!app.topLevelWindows().contains(window2));
QVERIFY(!app.topLevelWindows().contains(window1));
QCOMPARE(app.topLevelWindows().count(), 0);
}
QTEST_APPLESS_MAIN(tst_QGuiApplication)
#include "tst_qguiapplication.moc"