Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QPixMap management

QPixMap management

Scheduled Pinned Locked Moved Unsolved General and Desktop
6 Posts 2 Posters 623 Views
  • 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.
  • J Offline
    J Offline
    JacobNovitsky
    wrote on last edited by JacobNovitsky
    #1

    I need to place some objects in QWindow
    Qty = 80xQPixMap
    I want to set dimensions for each and automatically place it and browse those images with pushButton

    I can have needed effect with TableView, but it does not look as enterprise variant
    If still to consider TableView, I could use it if you can hide visible TableView components

    Basically I need sane and flexible way to manage QPixMap within QWindow or any other GUI interface

    JonBJ 1 Reply Last reply
    0
    • J JacobNovitsky

      I need to place some objects in QWindow
      Qty = 80xQPixMap
      I want to set dimensions for each and automatically place it and browse those images with pushButton

      I can have needed effect with TableView, but it does not look as enterprise variant
      If still to consider TableView, I could use it if you can hide visible TableView components

      Basically I need sane and flexible way to manage QPixMap within QWindow or any other GUI interface

      JonBJ Online
      JonBJ Online
      JonB
      wrote on last edited by
      #2

      @JacobNovitsky
      Especially if your images are different sizes you may want to consider Flow Layout Example rather than a tabular layout.

      J 1 Reply Last reply
      1
      • JonBJ JonB

        @JacobNovitsky
        Especially if your images are different sizes you may want to consider Flow Layout Example rather than a tabular layout.

        J Offline
        J Offline
        JacobNovitsky
        wrote on last edited by
        #3

        @JonB Is there any sample available so I can see ready product?

        JonBJ 1 Reply Last reply
        0
        • J JacobNovitsky

          @JonB Is there any sample available so I can see ready product?

          JonBJ Online
          JonBJ Online
          JonB
          wrote on last edited by JonB
          #4

          @JacobNovitsky How do you mean, it is already "ready"? Download from https://code.qt.io/cgit/qt/qtbase.git/tree/examples/widgets/layouts/flowlayout?h=6.8

          1 Reply Last reply
          0
          • J Offline
            J Offline
            JacobNovitsky
            wrote on last edited by JacobNovitsky
            #5

            How can I integrate images to be used with below?

            // Copyright (C) 2016 The Qt Company Ltd.
            // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
            
            #include <QtWidgets>
            
            #include "flowlayout.h"
            //! [1]
            FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing)
                : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
            {
                setContentsMargins(margin, margin, margin, margin);
            }
            
            FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing)
                : m_hSpace(hSpacing), m_vSpace(vSpacing)
            {
                setContentsMargins(margin, margin, margin, margin);
            }
            //! [1]
            
            //! [2]
            FlowLayout::~FlowLayout()
            {
                QLayoutItem *item;
                while ((item = takeAt(0)))
                    delete item;
            }
            //! [2]
            
            //! [3]
            void FlowLayout::addItem(QLayoutItem *item)
            {
                itemList.append(item);
            }
            //! [3]
            
            //! [4]
            int FlowLayout::horizontalSpacing() const
            {
                if (m_hSpace >= 0) {
                    return m_hSpace;
                } else {
                    return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
                }
            }
            
            int FlowLayout::verticalSpacing() const
            {
                if (m_vSpace >= 0) {
                    return m_vSpace;
                } else {
                    return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
                }
            }
            //! [4]
            
            //! [5]
            int FlowLayout::count() const
            {
                return itemList.size();
            }
            
            QLayoutItem *FlowLayout::itemAt(int index) const
            {
                return itemList.value(index);
            }
            
            QLayoutItem *FlowLayout::takeAt(int index)
            {
                if (index >= 0 && index < itemList.size())
                    return itemList.takeAt(index);
                return nullptr;
            }
            //! [5]
            
            //! [6]
            Qt::Orientations FlowLayout::expandingDirections() const
            {
                return { };
            }
            //! [6]
            
            //! [7]
            bool FlowLayout::hasHeightForWidth() const
            {
                return true;
            }
            
            int FlowLayout::heightForWidth(int width) const
            {
                int height = doLayout(QRect(0, 0, width, 0), true);
                return height;
            }
            //! [7]
            
            //! [8]
            void FlowLayout::setGeometry(const QRect &rect)
            {
                QLayout::setGeometry(rect);
                doLayout(rect, false);
            }
            
            QSize FlowLayout::sizeHint() const
            {
                return minimumSize();
            }
            
            QSize FlowLayout::minimumSize() const
            {
                QSize size;
                for (const QLayoutItem *item : std::as_const(itemList))
                    size = size.expandedTo(item->minimumSize());
            
                const QMargins margins = contentsMargins();
                size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom());
                return size;
            }
            //! [8]
            
            //! [9]
            int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
            {
                int left, top, right, bottom;
                getContentsMargins(&left, &top, &right, &bottom);
                QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
                int x = effectiveRect.x();
                int y = effectiveRect.y();
                int lineHeight = 0;
            //! [9]
            
            //! [10]
                for (QLayoutItem *item : std::as_const(itemList)) {
                    const QWidget *wid = item->widget();
                    int spaceX = horizontalSpacing();
                    if (spaceX == -1)
                        spaceX = wid->style()->layoutSpacing(
                            QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
                    int spaceY = verticalSpacing();
                    if (spaceY == -1)
                        spaceY = wid->style()->layoutSpacing(
                            QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
            //! [10]
            //! [11]
                    int nextX = x + item->sizeHint().width() + spaceX;
                    if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
                        x = effectiveRect.x();
                        y = y + lineHeight + spaceY;
                        nextX = x + item->sizeHint().width() + spaceX;
                        lineHeight = 0;
                    }
            
                    if (!testOnly)
                        item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
            
                    x = nextX;
                    lineHeight = qMax(lineHeight, item->sizeHint().height());
                }
                return y + lineHeight - rect.y() + bottom;
            }
            //! [11]
            //! [12]
            int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
            {
                QObject *parent = this->parent();
                if (!parent) {
                    return -1;
                } else if (parent->isWidgetType()) {
                    QWidget *pw = static_cast<QWidget *>(parent);
                    return pw->style()->pixelMetric(pm, nullptr, pw);
                } else {
                    return static_cast<QLayout *>(parent)->spacing();
                }
            }
            //! [12]
            
            JonBJ 1 Reply Last reply
            0
            • J JacobNovitsky

              How can I integrate images to be used with below?

              // Copyright (C) 2016 The Qt Company Ltd.
              // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
              
              #include <QtWidgets>
              
              #include "flowlayout.h"
              //! [1]
              FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing)
                  : QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
              {
                  setContentsMargins(margin, margin, margin, margin);
              }
              
              FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing)
                  : m_hSpace(hSpacing), m_vSpace(vSpacing)
              {
                  setContentsMargins(margin, margin, margin, margin);
              }
              //! [1]
              
              //! [2]
              FlowLayout::~FlowLayout()
              {
                  QLayoutItem *item;
                  while ((item = takeAt(0)))
                      delete item;
              }
              //! [2]
              
              //! [3]
              void FlowLayout::addItem(QLayoutItem *item)
              {
                  itemList.append(item);
              }
              //! [3]
              
              //! [4]
              int FlowLayout::horizontalSpacing() const
              {
                  if (m_hSpace >= 0) {
                      return m_hSpace;
                  } else {
                      return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
                  }
              }
              
              int FlowLayout::verticalSpacing() const
              {
                  if (m_vSpace >= 0) {
                      return m_vSpace;
                  } else {
                      return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
                  }
              }
              //! [4]
              
              //! [5]
              int FlowLayout::count() const
              {
                  return itemList.size();
              }
              
              QLayoutItem *FlowLayout::itemAt(int index) const
              {
                  return itemList.value(index);
              }
              
              QLayoutItem *FlowLayout::takeAt(int index)
              {
                  if (index >= 0 && index < itemList.size())
                      return itemList.takeAt(index);
                  return nullptr;
              }
              //! [5]
              
              //! [6]
              Qt::Orientations FlowLayout::expandingDirections() const
              {
                  return { };
              }
              //! [6]
              
              //! [7]
              bool FlowLayout::hasHeightForWidth() const
              {
                  return true;
              }
              
              int FlowLayout::heightForWidth(int width) const
              {
                  int height = doLayout(QRect(0, 0, width, 0), true);
                  return height;
              }
              //! [7]
              
              //! [8]
              void FlowLayout::setGeometry(const QRect &rect)
              {
                  QLayout::setGeometry(rect);
                  doLayout(rect, false);
              }
              
              QSize FlowLayout::sizeHint() const
              {
                  return minimumSize();
              }
              
              QSize FlowLayout::minimumSize() const
              {
                  QSize size;
                  for (const QLayoutItem *item : std::as_const(itemList))
                      size = size.expandedTo(item->minimumSize());
              
                  const QMargins margins = contentsMargins();
                  size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom());
                  return size;
              }
              //! [8]
              
              //! [9]
              int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
              {
                  int left, top, right, bottom;
                  getContentsMargins(&left, &top, &right, &bottom);
                  QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
                  int x = effectiveRect.x();
                  int y = effectiveRect.y();
                  int lineHeight = 0;
              //! [9]
              
              //! [10]
                  for (QLayoutItem *item : std::as_const(itemList)) {
                      const QWidget *wid = item->widget();
                      int spaceX = horizontalSpacing();
                      if (spaceX == -1)
                          spaceX = wid->style()->layoutSpacing(
                              QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
                      int spaceY = verticalSpacing();
                      if (spaceY == -1)
                          spaceY = wid->style()->layoutSpacing(
                              QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
              //! [10]
              //! [11]
                      int nextX = x + item->sizeHint().width() + spaceX;
                      if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
                          x = effectiveRect.x();
                          y = y + lineHeight + spaceY;
                          nextX = x + item->sizeHint().width() + spaceX;
                          lineHeight = 0;
                      }
              
                      if (!testOnly)
                          item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
              
                      x = nextX;
                      lineHeight = qMax(lineHeight, item->sizeHint().height());
                  }
                  return y + lineHeight - rect.y() + bottom;
              }
              //! [11]
              //! [12]
              int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
              {
                  QObject *parent = this->parent();
                  if (!parent) {
                      return -1;
                  } else if (parent->isWidgetType()) {
                      QWidget *pw = static_cast<QWidget *>(parent);
                      return pw->style()->pixelMetric(pm, nullptr, pw);
                  } else {
                      return static_cast<QLayout *>(parent)->spacing();
                  }
              }
              //! [12]
              
              JonBJ Online
              JonBJ Online
              JonB
              wrote on last edited by
              #6

              @JacobNovitsky
              Images are shown on QLabels. Use those as the widgets you add to the FlowLayout.

              1 Reply Last reply
              1

              • Login

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