Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Assign styles to rectangles (Make banner, polygon)
Forum Updated to NodeBB v4.3 + New Features

Assign styles to rectangles (Make banner, polygon)

Scheduled Pinned Locked Moved Solved QML and Qt Quick
7 Posts 4 Posters 2.8k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    aktay
    wrote on last edited by
    #1

    Hi all,

    I want to assign style to rectangles.Any ideas on this?The example is on below.

    alt metni

    Thanks.

    1 Reply Last reply
    0
    • YashpalY Offline
      YashpalY Offline
      Yashpal
      wrote on last edited by
      #2

      @aktay Canvas in QML/ Qpainter in Qt should be the choice to create polygons.

      A 1 Reply Last reply
      0
      • YashpalY Yashpal

        @aktay Canvas in QML/ Qpainter in Qt should be the choice to create polygons.

        A Offline
        A Offline
        aktay
        wrote on last edited by
        #3

        @Yashpal
        Thank you for the post.But I want to embed an object/item in the polygon. Canvas only draws, objects cannot be embed in these drawings.

        A YashpalY 2 Replies Last reply
        0
        • A aktay

          @Yashpal
          Thank you for the post.But I want to embed an object/item in the polygon. Canvas only draws, objects cannot be embed in these drawings.

          A Offline
          A Offline
          ambershark
          wrote on last edited by
          #4

          @aktay You'll need a custom control for this. The standard Rectangle can't be styled like that.

          There are lots of good examples, tutorials, and books on extending Qml. Here is an online/free one https://qmlbook.github.io. It doesn't have a chapter on doing custom controls I don't think but it's worth a read. Maybe chapter 16 might cover it. Either way, you can find other tutorials and examples with a google search.

          My L-GPL'd C++ Logger github.com/ambershark-mike/sharklog

          1 Reply Last reply
          0
          • A aktay

            @Yashpal
            Thank you for the post.But I want to embed an object/item in the polygon. Canvas only draws, objects cannot be embed in these drawings.

            YashpalY Offline
            YashpalY Offline
            Yashpal
            wrote on last edited by
            #5

            @aktay Okay. Then, you can go with option of extending QML with C++ like ambershark said. Create a class that does polygon creation for you, register it with QML engine and create polygon objects in QML, add children to it.

            1 Reply Last reply
            0
            • ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #6

              Hi! Easiest way to get custom shapes is by deriving from QQuickPaintedItem. See the following example with two custom items:

              myitem.h

              #ifndef MYITEM_H
              #define MYITEM_H
              
              #include <QQuickPaintedItem>
              
              class MyItem : public QQuickPaintedItem
              {
                  Q_OBJECT
                  Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
                  Q_PROPERTY(QColor borderColor MEMBER m_borderColor NOTIFY borderColorChanged)
                  Q_PROPERTY(qreal radius MEMBER m_radius NOTIFY radiusChanged)
                  Q_PROPERTY(qreal borderWidth MEMBER m_borderWidth NOTIFY borderWidthChanged)
              
              public:
                  MyItem(QQuickItem *parent = nullptr);
                  virtual void paint(QPainter *painter) override;
              
              signals:
                  void colorChanged(const QColor&);
                  void borderColorChanged(const QColor&);
                  void radiusChanged(qreal);
                  void borderWidthChanged(qreal);
              
              private:
                  QColor m_color{255,255,255};
                  QColor m_borderColor{0,0,0};
                  qreal m_radius{0.0};
                  qreal m_borderWidth{1.0};
              };
              
              #endif // MYITEM_H
              

              myitem.cpp

              #include "myitem.h"
              #include <QPainter>
              #include <QPen>
              #include <QBrush>
              #include <QColor>
              #include <QPointF>
              #include <QPainterPath>
              #include <QRectF>
              
              MyItem::MyItem(QQuickItem *parent)
                  : QQuickPaintedItem(parent)
              {
                  connect(this, SIGNAL(colorChanged(QColor)), this, SLOT(update()));
                  connect(this, SIGNAL(borderColorChanged(QColor)), this, SLOT(update()));
                  connect(this, SIGNAL(radiusChanged(qreal)), this, SLOT(update()));
                  connect(this, SIGNAL(borderWidthChanged(qreal)), this, SLOT(update()));
              }
              
              void MyItem::paint(QPainter *painter)
              {
                  painter->setRenderHint(QPainter::Antialiasing);
              
                  const qreal w = width();
                  const qreal h = height();
                  const qreal p = m_borderWidth < 0.0 ? 0.0 : m_borderWidth;
                  const qreal d = p/2.0;
              
                  QPainterPath path;
              
                  if (m_radius < 0.01) {
                      path.moveTo(w-d,d);
                      path.lineTo(d,d);
                      path.lineTo(d,h-d);
                      path.lineTo(w-d,h-d);
                      path.lineTo(w-d,d);
                  } else {
                      path.moveTo(w-m_radius-d, d);
                      path.arcTo(QRectF(QPointF(-m_radius+d,-m_radius+d),QPointF(m_radius+d,m_radius+d)), 0.0, -90.0);
                      path.arcTo(QRectF(QPointF(-m_radius+d,h-m_radius-d),QPointF(m_radius+d,h+m_radius-d)), 90.0, -90.0);
                      path.arcTo(QRectF(QPointF(w-m_radius-d,h-m_radius-d),QPointF(w+m_radius-d,h+m_radius-d)), 180.0, -90.0);
                      path.arcTo(QRectF(QPointF(w-m_radius-d,-m_radius+d),QPointF(w+m_radius-d,m_radius+d)), 270.0, -90.0);
                  }
              
                  QPen pen;
                  pen.setColor(m_borderColor);
                  if (p > 0) {
                      pen.setWidth(p);
                  } else {
                      pen.setStyle(Qt::NoPen);
                  }
                  painter->setPen(pen);
              
                  QBrush brush;
                  brush.setColor(m_color);
                  brush.setStyle(Qt::SolidPattern);
                  painter->setBrush(brush);
              
                  painter->drawPath(path);
              }
              

              mybanner.h

              #ifndef MYBANNER_H
              #define MYBANNER_H
              
              #include <QQuickPaintedItem>
              
              class MyBanner : public QQuickPaintedItem
              {
                  Q_OBJECT
                  Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
                  Q_PROPERTY(QColor borderColor MEMBER m_borderColor NOTIFY borderColorChanged)
                  Q_PROPERTY(qreal length MEMBER m_length NOTIFY lengthChanged)
                  Q_PROPERTY(qreal borderWidth MEMBER m_borderWidth NOTIFY borderWidthChanged)
              
              public:
                  MyBanner(QQuickItem *parent = nullptr);
                  virtual void paint(QPainter *painter) override;
              
              signals:
                  void colorChanged(const QColor&);
                  void borderColorChanged(const QColor&);
                  void lengthChanged(qreal);
                  void borderWidthChanged(qreal);
              
              private:
                  QColor m_color{255,255,255};
                  QColor m_borderColor{0,0,0};
                  qreal m_length{0.0};
                  qreal m_borderWidth{1.0};
              };
              
              #endif // MYBANNER_H
              

              mybanner.cpp

              #include "mybanner.h"
              #include <QPainter>
              #include <QPen>
              #include <QBrush>
              #include <QColor>
              #include <QPointF>
              #include <QPainterPath>
              #include <QRectF>
              
              MyBanner::MyBanner(QQuickItem *parent)
                  : QQuickPaintedItem(parent)
              {
                  connect(this, SIGNAL(colorChanged(QColor)), this, SLOT(update()));
                  connect(this, SIGNAL(borderColorChanged(QColor)), this, SLOT(update()));
                  connect(this, SIGNAL(lengthChanged(qreal)), this, SLOT(update()));
                  connect(this, SIGNAL(borderWidthChanged(qreal)), this, SLOT(update()));
              }
              
              void MyBanner::paint(QPainter *painter)
              {
                  painter->setRenderHint(QPainter::Antialiasing);
              
                  const qreal w = width();
                  const qreal h = height();
                  const qreal p = m_borderWidth < 0.0 ? 0.0 : m_borderWidth;
                  const qreal d = p/2.0;
                  const qreal len = m_length > w ? w : m_length;
              
                  QPainterPath path;
                  path.moveTo(w-d,d);
                  path.lineTo(d,d);
                  path.lineTo(d,h-d);
                  path.lineTo(w-d,h-d);
                  path.lineTo(w-d-len,h/2.0);
                  path.lineTo(w-d,d);
              
                  QPen pen;
                  pen.setColor(m_borderColor);
                  if (p > 0) {
                      pen.setWidth(p);
                  } else {
                      pen.setStyle(Qt::NoPen);
                  }
                  painter->setPen(pen);
              
                  QBrush brush;
                  brush.setColor(m_color);
                  brush.setStyle(Qt::SolidPattern);
                  painter->setBrush(brush);
              
                  painter->drawPath(path);
              }
              

              main.cpp

              #include <QGuiApplication>
              #include <QQmlApplicationEngine>
              #include "myitem.h"
              #include "mybanner.h"
              
              int main(int argc, char *argv[])
              {
                  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
                  QGuiApplication app(argc, argv);
              
                  qmlRegisterType<MyItem>("io.qt.forum", 1, 0, "MyItem");
                  qmlRegisterType<MyBanner>("io.qt.forum", 1, 0, "MyBanner");
              
                  QQmlApplicationEngine engine;
                  engine.load(QUrl(QLatin1String("qrc:/main.qml")));
              
                  return app.exec();
              }
              

              main.qml

              import QtQuick 2.7
              import QtQuick.Controls 2.0
              import QtQuick.Layouts 1.0
              import io.qt.forum 1.0
              
              ApplicationWindow {
                  visible: true
                  width: 640
                  height: 480
                  color: "#d8d8d8"
              
                  Row {
                      x: 20
                      y: 20
                      spacing: 20
                      Column {
                          spacing: -20
                          MyItem { width: 160; height: 60; radius: 12; color: "red"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "orange"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "yellow"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "lime"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "aqua"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "skyblue"; }
                      }
                      Column {
                          spacing: -20
                          MyItem { width: 160; height: 60; radius: 12; color: "mediumorchid"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "thistle"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "hotpink"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "mistyrose"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "palegreen"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "paleturquoise"; }
                      }
                      Column {
                          spacing: -20
                          MyItem { width: 160; height: 60; radius: 12; color: "saddlebrown"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "burlywood"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "black"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "darkgrey"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "lightgrey"; }
                          MyItem { width: 160; height: 60; radius: 12; color: "white"; }
                      }
                  }
              
                  MyBanner {
                      x: 20
                      y: 400
                      width: 400
                      height: 60
                      length: 30
                      borderWidth: 2
                      color: "#a0a0a0"
                      Text {
                          anchors.centerIn: parent
                          color: "white"
                          text: "DIGITAL BANNERS"
                          font.pixelSize: 30
                          font.family: "Liberation Serif"
                      }
                  }
              
                  Rectangle {
                      width: 300
                      height: 40
                      x: 50
                      y: 320
                      rotation: -5
                      antialiasing: true
                      Text {
                          font.pixelSize: 24
                          anchors.centerIn: parent
                          text: "<font face='verdana' color='red'>forum</font>.<font face='Courier' color='green'>Qt</font>.<b>io</b>"
                      }
                  }
              }
              
              A 1 Reply Last reply
              1
              • ? A Former User

                Hi! Easiest way to get custom shapes is by deriving from QQuickPaintedItem. See the following example with two custom items:

                myitem.h

                #ifndef MYITEM_H
                #define MYITEM_H
                
                #include <QQuickPaintedItem>
                
                class MyItem : public QQuickPaintedItem
                {
                    Q_OBJECT
                    Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
                    Q_PROPERTY(QColor borderColor MEMBER m_borderColor NOTIFY borderColorChanged)
                    Q_PROPERTY(qreal radius MEMBER m_radius NOTIFY radiusChanged)
                    Q_PROPERTY(qreal borderWidth MEMBER m_borderWidth NOTIFY borderWidthChanged)
                
                public:
                    MyItem(QQuickItem *parent = nullptr);
                    virtual void paint(QPainter *painter) override;
                
                signals:
                    void colorChanged(const QColor&);
                    void borderColorChanged(const QColor&);
                    void radiusChanged(qreal);
                    void borderWidthChanged(qreal);
                
                private:
                    QColor m_color{255,255,255};
                    QColor m_borderColor{0,0,0};
                    qreal m_radius{0.0};
                    qreal m_borderWidth{1.0};
                };
                
                #endif // MYITEM_H
                

                myitem.cpp

                #include "myitem.h"
                #include <QPainter>
                #include <QPen>
                #include <QBrush>
                #include <QColor>
                #include <QPointF>
                #include <QPainterPath>
                #include <QRectF>
                
                MyItem::MyItem(QQuickItem *parent)
                    : QQuickPaintedItem(parent)
                {
                    connect(this, SIGNAL(colorChanged(QColor)), this, SLOT(update()));
                    connect(this, SIGNAL(borderColorChanged(QColor)), this, SLOT(update()));
                    connect(this, SIGNAL(radiusChanged(qreal)), this, SLOT(update()));
                    connect(this, SIGNAL(borderWidthChanged(qreal)), this, SLOT(update()));
                }
                
                void MyItem::paint(QPainter *painter)
                {
                    painter->setRenderHint(QPainter::Antialiasing);
                
                    const qreal w = width();
                    const qreal h = height();
                    const qreal p = m_borderWidth < 0.0 ? 0.0 : m_borderWidth;
                    const qreal d = p/2.0;
                
                    QPainterPath path;
                
                    if (m_radius < 0.01) {
                        path.moveTo(w-d,d);
                        path.lineTo(d,d);
                        path.lineTo(d,h-d);
                        path.lineTo(w-d,h-d);
                        path.lineTo(w-d,d);
                    } else {
                        path.moveTo(w-m_radius-d, d);
                        path.arcTo(QRectF(QPointF(-m_radius+d,-m_radius+d),QPointF(m_radius+d,m_radius+d)), 0.0, -90.0);
                        path.arcTo(QRectF(QPointF(-m_radius+d,h-m_radius-d),QPointF(m_radius+d,h+m_radius-d)), 90.0, -90.0);
                        path.arcTo(QRectF(QPointF(w-m_radius-d,h-m_radius-d),QPointF(w+m_radius-d,h+m_radius-d)), 180.0, -90.0);
                        path.arcTo(QRectF(QPointF(w-m_radius-d,-m_radius+d),QPointF(w+m_radius-d,m_radius+d)), 270.0, -90.0);
                    }
                
                    QPen pen;
                    pen.setColor(m_borderColor);
                    if (p > 0) {
                        pen.setWidth(p);
                    } else {
                        pen.setStyle(Qt::NoPen);
                    }
                    painter->setPen(pen);
                
                    QBrush brush;
                    brush.setColor(m_color);
                    brush.setStyle(Qt::SolidPattern);
                    painter->setBrush(brush);
                
                    painter->drawPath(path);
                }
                

                mybanner.h

                #ifndef MYBANNER_H
                #define MYBANNER_H
                
                #include <QQuickPaintedItem>
                
                class MyBanner : public QQuickPaintedItem
                {
                    Q_OBJECT
                    Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
                    Q_PROPERTY(QColor borderColor MEMBER m_borderColor NOTIFY borderColorChanged)
                    Q_PROPERTY(qreal length MEMBER m_length NOTIFY lengthChanged)
                    Q_PROPERTY(qreal borderWidth MEMBER m_borderWidth NOTIFY borderWidthChanged)
                
                public:
                    MyBanner(QQuickItem *parent = nullptr);
                    virtual void paint(QPainter *painter) override;
                
                signals:
                    void colorChanged(const QColor&);
                    void borderColorChanged(const QColor&);
                    void lengthChanged(qreal);
                    void borderWidthChanged(qreal);
                
                private:
                    QColor m_color{255,255,255};
                    QColor m_borderColor{0,0,0};
                    qreal m_length{0.0};
                    qreal m_borderWidth{1.0};
                };
                
                #endif // MYBANNER_H
                

                mybanner.cpp

                #include "mybanner.h"
                #include <QPainter>
                #include <QPen>
                #include <QBrush>
                #include <QColor>
                #include <QPointF>
                #include <QPainterPath>
                #include <QRectF>
                
                MyBanner::MyBanner(QQuickItem *parent)
                    : QQuickPaintedItem(parent)
                {
                    connect(this, SIGNAL(colorChanged(QColor)), this, SLOT(update()));
                    connect(this, SIGNAL(borderColorChanged(QColor)), this, SLOT(update()));
                    connect(this, SIGNAL(lengthChanged(qreal)), this, SLOT(update()));
                    connect(this, SIGNAL(borderWidthChanged(qreal)), this, SLOT(update()));
                }
                
                void MyBanner::paint(QPainter *painter)
                {
                    painter->setRenderHint(QPainter::Antialiasing);
                
                    const qreal w = width();
                    const qreal h = height();
                    const qreal p = m_borderWidth < 0.0 ? 0.0 : m_borderWidth;
                    const qreal d = p/2.0;
                    const qreal len = m_length > w ? w : m_length;
                
                    QPainterPath path;
                    path.moveTo(w-d,d);
                    path.lineTo(d,d);
                    path.lineTo(d,h-d);
                    path.lineTo(w-d,h-d);
                    path.lineTo(w-d-len,h/2.0);
                    path.lineTo(w-d,d);
                
                    QPen pen;
                    pen.setColor(m_borderColor);
                    if (p > 0) {
                        pen.setWidth(p);
                    } else {
                        pen.setStyle(Qt::NoPen);
                    }
                    painter->setPen(pen);
                
                    QBrush brush;
                    brush.setColor(m_color);
                    brush.setStyle(Qt::SolidPattern);
                    painter->setBrush(brush);
                
                    painter->drawPath(path);
                }
                

                main.cpp

                #include <QGuiApplication>
                #include <QQmlApplicationEngine>
                #include "myitem.h"
                #include "mybanner.h"
                
                int main(int argc, char *argv[])
                {
                    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
                    QGuiApplication app(argc, argv);
                
                    qmlRegisterType<MyItem>("io.qt.forum", 1, 0, "MyItem");
                    qmlRegisterType<MyBanner>("io.qt.forum", 1, 0, "MyBanner");
                
                    QQmlApplicationEngine engine;
                    engine.load(QUrl(QLatin1String("qrc:/main.qml")));
                
                    return app.exec();
                }
                

                main.qml

                import QtQuick 2.7
                import QtQuick.Controls 2.0
                import QtQuick.Layouts 1.0
                import io.qt.forum 1.0
                
                ApplicationWindow {
                    visible: true
                    width: 640
                    height: 480
                    color: "#d8d8d8"
                
                    Row {
                        x: 20
                        y: 20
                        spacing: 20
                        Column {
                            spacing: -20
                            MyItem { width: 160; height: 60; radius: 12; color: "red"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "orange"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "yellow"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "lime"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "aqua"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "skyblue"; }
                        }
                        Column {
                            spacing: -20
                            MyItem { width: 160; height: 60; radius: 12; color: "mediumorchid"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "thistle"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "hotpink"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "mistyrose"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "palegreen"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "paleturquoise"; }
                        }
                        Column {
                            spacing: -20
                            MyItem { width: 160; height: 60; radius: 12; color: "saddlebrown"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "burlywood"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "black"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "darkgrey"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "lightgrey"; }
                            MyItem { width: 160; height: 60; radius: 12; color: "white"; }
                        }
                    }
                
                    MyBanner {
                        x: 20
                        y: 400
                        width: 400
                        height: 60
                        length: 30
                        borderWidth: 2
                        color: "#a0a0a0"
                        Text {
                            anchors.centerIn: parent
                            color: "white"
                            text: "DIGITAL BANNERS"
                            font.pixelSize: 30
                            font.family: "Liberation Serif"
                        }
                    }
                
                    Rectangle {
                        width: 300
                        height: 40
                        x: 50
                        y: 320
                        rotation: -5
                        antialiasing: true
                        Text {
                            font.pixelSize: 24
                            anchors.centerIn: parent
                            text: "<font face='verdana' color='red'>forum</font>.<font face='Courier' color='green'>Qt</font>.<b>io</b>"
                        }
                    }
                }
                
                A Offline
                A Offline
                aktay
                wrote on last edited by
                #7

                @Wieland

                Thank you for your effort.But to draw this picture. And in this way, objects can not be buried in shapes. I think I will solve my problem with png pictures. I will make some parts of the pictures transparent and some of them black background.

                Then, z: -1 and z: 1 values will appear in the transparent area where I want them to appear, the areas I want to hide will stay under the black background.

                For example:

                Image{
                id:backgroundImage
                source: "background.png"
                
                Map{
                id :map
                ancohrs.fill:parent
                anchors.centerIn:parent.center
                z: -1 // The map will not appear under non-transparent areas.
                // Other map codes ....
                }
                }
                

                Thank you for all. Have a nice coding.

                1 Reply Last reply
                0

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved