Weather Anchor Layout Example▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include <QApplication>
#include <QLabel>
#include <QPainter>
#include <QPushButton>
#include <QGraphicsAnchorLayout>
#include <QGraphicsProxyWidget>
#include <QGraphicsScene>
#include <QGraphicsSceneResizeEvent>
#include <QGraphicsView>
#include <QGraphicsWidget>
class
GraphicsView : public
QGraphicsView
{
public
:
GraphicsView(QGraphicsScene *
scene, QGraphicsWidget *
widget)
:
QGraphicsView(scene), w(widget)
{
}
void
resizeEvent(QResizeEvent *
event) override
{
w-&
gt;setGeometry(0
, 0
, event-&
gt;size().width(), event-&
gt;size().height());
}
QGraphicsWidget *
w;
}
;
class
PixmapWidget : public
QGraphicsLayoutItem
{
public
:
PixmapWidget(const
QPixmap &
amp;pix)
:
QGraphicsLayoutItem()
{
original =
new
QGraphicsPixmapItem(pix);
setGraphicsItem(original);
original-&
gt;show();
r =
QRectF(QPointF(0
, 0
), pix.size());
}
~
PixmapWidget()
{
setGraphicsItem(0
);
delete
original;
}
void
setZValue(qreal z)
{
original-&
gt;setZValue(z);
}
void
setGeometry (const
QRectF &
amp;rect) override
{
original-&
gt;setTransform(QTransform::
fromScale(rect.width() /
r.width(),
rect.height() /
r.height()), true
);
original-&
gt;setPos(rect.x(), rect.y());
r =
rect;
}
protected
:
QSizeF sizeHint(Qt::
SizeHint which, const
QSizeF &
amp;constraint =
QSizeF()) const
override
{
Q_UNUSED(constraint);
QSizeF sh;
switch
(which) {
case
Qt::
MinimumSize:
sh =
QSizeF(0
, 0
);
break
;
case
Qt::
PreferredSize:
sh =
QSizeF(50
, 50
);
break
;
case
Qt::
MaximumSize:
sh =
QSizeF(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
break
;
default
:
break
;
}
return
sh;
}
private
:
QGraphicsPixmapItem *
original;
QRectF r;
}
;
class
PlaceWidget : public
QGraphicsWidget
{
Q_OBJECT
public
:
PlaceWidget(const
QPixmap &
amp;pix)
:
QGraphicsWidget()
, original(pix)
, scaled(pix)
{
}
void
paint(QPainter *
painter, const
QStyleOptionGraphicsItem *
, QWidget *
) override
{
QPointF reflection =
QPointF();
reflection.setY(scaled.height() +
2
);
painter-&
gt;drawPixmap(QPointF(), scaled);
QPixmap tmp(scaled.size());
tmp.fill(Qt::
transparent);
QPainter p(&
amp;tmp);
// create gradient
QPoint p1(scaled.width() /
2
, 0
);
QPoint p2(scaled.width() /
2
, scaled.height());
QLinearGradient linearGrad(p1, p2);
linearGrad.setColorAt(0
, QColor(0
, 0
, 0
, 0
));
linearGrad.setColorAt(0.65
, QColor(0
, 0
, 0
, 127
));
linearGrad.setColorAt(1
, QColor(0
, 0
, 0
, 255
));
// apply 'mask'
p.setBrush(linearGrad);
p.fillRect(0
, 0
, tmp.width(), tmp.height(), QBrush(linearGrad));
p.fillRect(0
, 0
, tmp.width(), tmp.height(), QBrush(linearGrad));
// paint the image flipped
p.setCompositionMode(QPainter::
CompositionMode_DestinationOver);
p.drawPixmap(0
, 0
, QPixmap::
fromImage(scaled.toImage().mirrored(false
, true
)));
p.end();
painter-&
gt;drawPixmap(reflection, tmp);
}
void
resizeEvent(QGraphicsSceneResizeEvent *
event) override
{
QSize newSize =
event-&
gt;newSize().toSize();
newSize.setHeight(newSize.height() /
2
);
scaled =
original.scaled(newSize);
}
QRectF boundingRect() const
override
{
QSize size(scaled.width(), scaled.height() *
2
+
2
);
return
QRectF(QPointF(0
, 0
), size);
}
private
:
QPixmap original;
QPixmap scaled;
}
;
int
main(int
argc, char
*
argv[])
{
Q_INIT_RESOURCE(weatheranchorlayout);
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setSceneRect(0
, 0
, 800
, 480
);
// pixmaps widgets
PixmapWidget *
title =
new
PixmapWidget(QPixmap(":/images/title.jpg"
));
PlaceWidget *
place =
new
PlaceWidget(QPixmap(":/images/place.jpg"
));
PixmapWidget *
details =
new
PixmapWidget(QPixmap(":/images/5days.jpg"
));
PixmapWidget *
sunnyWeather =
new
PixmapWidget(QPixmap(":/images/weather-few-clouds.png"
));
PixmapWidget *
tabbar =
new
PixmapWidget(QPixmap(":/images/tabbar.jpg"
));
// setup sizes
title-&
gt;setPreferredSize(QSizeF(348
, 45
));
title-&
gt;setSizePolicy(QSizePolicy::
Minimum, QSizePolicy::
Minimum);
place-&
gt;setPreferredSize(QSizeF(96
, 72
));
place-&
gt;setSizePolicy(QSizePolicy::
Minimum, QSizePolicy::
Minimum);
details-&
gt;setMinimumSize(QSizeF(200
, 112
));
details-&
gt;setPreferredSize(QSizeF(200
, 112
));
details-&
gt;setSizePolicy(QSizePolicy::
Minimum, QSizePolicy::
Minimum);
tabbar-&
gt;setPreferredSize(QSizeF(70
, 24
));
tabbar-&
gt;setSizePolicy(QSizePolicy::
Minimum, QSizePolicy::
Minimum);
sunnyWeather-&
gt;setPreferredSize(QSizeF(128
, 97
));
sunnyWeather-&
gt;setSizePolicy(QSizePolicy::
Minimum, QSizePolicy::
Minimum);
sunnyWeather-&
gt;setZValue(9999
);
// start anchor layout
QGraphicsAnchorLayout *
layout =
new
QGraphicsAnchorLayout;
layout-&
gt;setSpacing(0
);
// setup the main widget
QGraphicsWidget *
widget =
new
QGraphicsWidget(0
, Qt::
Window);
QPalette p;
p.setColor(QPalette::
Window, Qt::
black);
widget-&
gt;setPalette(p);
widget-&
gt;setPos(20
, 20
);
widget-&
gt;setLayout(layout);
// vertical anchors
QGraphicsAnchor *
anchor =
layout-&
gt;addAnchor(title, Qt::
AnchorTop, layout, Qt::
AnchorTop);
anchor =
layout-&
gt;addAnchor(place, Qt::
AnchorTop, title, Qt::
AnchorBottom);
anchor-&
gt;setSpacing(12
);
anchor =
layout-&
gt;addAnchor(place, Qt::
AnchorBottom, layout, Qt::
AnchorBottom);
anchor-&
gt;setSpacing(12
);
anchor =
layout-&
gt;addAnchor(sunnyWeather, Qt::
AnchorTop, title, Qt::
AnchorTop);
anchor =
layout-&
gt;addAnchor(sunnyWeather, Qt::
AnchorBottom, layout, Qt::
AnchorVerticalCenter);
anchor =
layout-&
gt;addAnchor(tabbar, Qt::
AnchorTop, title, Qt::
AnchorBottom);
anchor-&
gt;setSpacing(5
);
anchor =
layout-&
gt;addAnchor(details, Qt::
AnchorTop, tabbar, Qt::
AnchorBottom);
anchor-&
gt;setSpacing(2
);
anchor =
layout-&
gt;addAnchor(details, Qt::
AnchorBottom, layout, Qt::
AnchorBottom);
anchor-&
gt;setSpacing(12
);
// horizontal anchors
anchor =
layout-&
gt;addAnchor(layout, Qt::
AnchorLeft, title, Qt::
AnchorLeft);
anchor =
layout-&
gt;addAnchor(title, Qt::
AnchorRight, layout, Qt::
AnchorRight);
anchor =
layout-&
gt;addAnchor(place, Qt::
AnchorLeft, layout, Qt::
AnchorLeft);
anchor-&
gt;setSpacing(15
);
anchor =
layout-&
gt;addAnchor(place, Qt::
AnchorRight, details, Qt::
AnchorLeft);
anchor-&
gt;setSpacing(35
);
anchor =
layout-&
gt;addAnchor(sunnyWeather, Qt::
AnchorLeft, place, Qt::
AnchorHorizontalCenter);
anchor =
layout-&
gt;addAnchor(sunnyWeather, Qt::
AnchorRight, layout, Qt::
AnchorHorizontalCenter);
anchor =
layout-&
gt;addAnchor(tabbar, Qt::
AnchorHorizontalCenter, details, Qt::
AnchorHorizontalCenter);
anchor =
layout-&
gt;addAnchor(details, Qt::
AnchorRight, layout, Qt::
AnchorRight);
// QGV setup
scene.addItem(widget);
scene.setBackgroundBrush(Qt::
white);
QGraphicsView *
view =
new
QGraphicsView(&
amp;scene);
view-&
gt;show();
return
app.exec();
}
#include
"main.moc"