summaryrefslogtreecommitdiffstats
path: root/demos
diff options
context:
space:
mode:
authorAndreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com>2009-04-08 08:27:28 (GMT)
committerAndreas Aardal Hanssen <andreas.aardal.hanssen@nokia.com>2009-04-08 08:33:34 (GMT)
commit510ce6fa8a3a30063744eaaf004850679610060e (patch)
treedfd5f6c3fbebc9c9fa04ba67e93acd0c408fd5ad /demos
parent3f3d09cf1511dde99797671a7bc848cdabc8d7fa (diff)
downloadQt-510ce6fa8a3a30063744eaaf004850679610060e.zip
Qt-510ce6fa8a3a30063744eaaf004850679610060e.tar.gz
Qt-510ce6fa8a3a30063744eaaf004850679610060e.tar.bz2
BT: Fix the embedded dialogs demo on Mac OS X and Motif style
The CustomProxy class installs an event filter on its child to detect whether it is shadowed by a popup or not. The problem is it does this regardless of whether it currently has a scene assigned or not. Styles that assign palettes, or otherwise cause side effects when assigned to a QGraphicsProxyWidget, will cause the demo to print warnings to the console and fail to install the event filter. The reason for the failure to install the filter is that QGraphicsItem only allows scene event filters to be installed between items that are in the same scene. So, depending on the style, you either get an ItemSceneHasChanged or an ItemChildAddedChange first. The demo must account for this, and install its filter only when the items are guaranteed to be in the scene already. Reviewed-by: Alexis
Diffstat (limited to 'demos')
-rw-r--r--demos/embeddeddialogs/customproxy.cpp17
-rw-r--r--demos/embeddeddialogs/customproxy.h1
2 files changed, 15 insertions, 3 deletions
diff --git a/demos/embeddeddialogs/customproxy.cpp b/demos/embeddeddialogs/customproxy.cpp
index 56a0548..dd8766f 100644
--- a/demos/embeddeddialogs/customproxy.cpp
+++ b/demos/embeddeddialogs/customproxy.cpp
@@ -44,7 +44,7 @@
#include <QtGui>
CustomProxy::CustomProxy(QGraphicsItem *parent, Qt::WindowFlags wFlags)
- : QGraphicsProxyWidget(parent, wFlags), popupShown(false)
+ : QGraphicsProxyWidget(parent, wFlags), popupShown(false), currentPopup(0)
{
timeLine = new QTimeLine(250, this);
connect(timeLine, SIGNAL(valueChanged(qreal)),
@@ -111,8 +111,19 @@ bool CustomProxy::sceneEventFilter(QGraphicsItem *watched, QEvent *event)
QVariant CustomProxy::itemChange(GraphicsItemChange change, const QVariant &value)
{
- if (change == ItemChildRemovedChange)
- removeSceneEventFilter(this);
+ if (change == ItemChildAddedChange || change == ItemChildRemovedChange) {
+ if (change == ItemChildAddedChange) {
+ currentPopup = qVariantValue<QGraphicsItem *>(value);
+ currentPopup->setCacheMode(ItemCoordinateCache);
+ if (scene())
+ currentPopup->installSceneEventFilter(this);
+ } else if (scene()) {
+ currentPopup->removeSceneEventFilter(this);
+ currentPopup = 0;
+ }
+ } else if (currentPopup && change == ItemSceneHasChanged) {
+ currentPopup->installSceneEventFilter(this);
+ }
return QGraphicsProxyWidget::itemChange(change, value);
}
diff --git a/demos/embeddeddialogs/customproxy.h b/demos/embeddeddialogs/customproxy.h
index 0a5fbaf..d324426 100644
--- a/demos/embeddeddialogs/customproxy.h
+++ b/demos/embeddeddialogs/customproxy.h
@@ -70,6 +70,7 @@ private slots:
private:
QTimeLine *timeLine;
bool popupShown;
+ QGraphicsItem *currentPopup;
};
#endif