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
Qt 6.11 is out! See what's new in the release blog

QPixMap management

Scheduled Pinned Locked Moved Unsolved General and Desktop
6 Posts 2 Posters 965 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 Offline
      JonBJ Offline
      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 Offline
          JonBJ Offline
          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 Offline
              JonBJ Offline
              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