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. Aligning Editor to tableView cell
Qt 6.11 is out! See what's new in the release blog

Aligning Editor to tableView cell

Scheduled Pinned Locked Moved Solved General and Desktop
5 Posts 3 Posters 1.8k Views 2 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.
  • G Offline
    G Offline
    gabor53
    wrote on last edited by
    #1

    I have a tableview for reviewing and correcting db data. To change the image stored in the database I created a qpushbutton on top of the tableview cell (as part of a delegate). When you click on the button it opens acqfiledialog.
    The problem is that the qpushbutton is the right size but it is not centered on the tableview cell. How can I center it?
    Thank you.

    1 Reply Last reply
    0
    • yuvaramY Offline
      yuvaramY Offline
      yuvaram
      wrote on last edited by
      #2

      can you provide a sample code

      Yuvaram Aligeti
      Embedded Qt Developer
      : )

      G 1 Reply Last reply
      0
      • yuvaramY yuvaram

        can you provide a sample code

        G Offline
        G Offline
        gabor53
        wrote on last edited by
        #3

        @yuvaram
        Here is the code:

        imagedelegate.cpp:

        #include "imagedelegate.h"
        
        ImageDelegate::ImageDelegate(QObject* parent) : QStyledItemDelegate(parent) {
        
        }
        
        QWidget* ImageDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
          Q_UNUSED(option);
          Q_UNUSED(index);
          return new ImagePickButton(parent);
        }
        
        void ImageDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const {
          ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
          Q_ASSERT(imgPick);
          imgPick->setSelectedFile(index.data(Qt::UserRole).toString());
        }
        
        void ImageDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const {
          ImagePickButton* imgPick = qobject_cast<ImagePickButton*>(editor);
          Q_ASSERT(imgPick);
        
          if(imgPick->selectedFile().isEmpty()) {
            model->setData(index, QVariant(), Qt::UserRole);
            model->setData(index, QVariant(), Qt::DecorationRole);
          } else {
            model->setData(index, imgPick->selectedFile(), Qt::UserRole);
            model->setData(index, QIcon(imgPick->selectedFile()), Qt::DecorationRole);
          }
        }
        
        void ImageDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const {
          Q_UNUSED(index);
          editor->setGeometry(option.rect);
        }
        

        imagepickbutton:

        #include "imagepickbutton.h"
        
        ImagePickButton::ImagePickButton(QWidget* parent) : QWidget(parent) {
          m_mainButton = new QPushButton(tr("Select \n Image"), this);
        
          m_mainButton->setStyleSheet ("font: bold;"
                                       "font-size: 12px;"
                                       "background-color: rgba(255, 255, 255, 100);");
        
        
          m_mainButton->setMaximumWidth(100);
          m_mainButton->setMinimumWidth (100);
          m_mainButton->setMaximumHeight (100);
          m_mainButton->setMinimumHeight (100);
        
          QHBoxLayout* mainLay = new QHBoxLayout(this);
          mainLay->addWidget(m_mainButton);
        
          connect(m_mainButton, &QPushButton::clicked, this, &ImagePickButton::selectImageFile);
        }
        
        const QString& ImagePickButton::selectedFile() const {
          return  m_selectedFile;
        }
        
        void ImagePickButton::setSelectedFile(const QString& val) {
          if(m_selectedFile == val)
            return;
        
          m_selectedFile = val;
        
          if(m_selectedFile.isEmpty()) {
            m_mainButton->setText(tr("Select Image"));
            QFont buttonFont = m_mainButton->font();
            buttonFont.setPointSize(5);
            m_mainButton->setIcon(QIcon());
          } else {
            m_mainButton->setText(QString());
            m_mainButton->setIcon(QIcon(m_selectedFile));
            m_mainButton->setMaximumWidth(100);
            m_mainButton->setMinimumWidth(100);
          }
          emit selectedFileChanged(m_selectedFile);
        }
        
        void ImagePickButton::selectImageFile() {
          const QString newFile = QFileDialog::getOpenFileName(this, tr("Open Image"), QString(), tr("Images (*.png *.xpm *.jpg)"));
        
          if(!newFile.isEmpty())
            setSelectedFile(newFile);
        }
        
        
        
        
        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by VRonin
          #4

          I think the problem comes the layout in ImagePickButton try

          m_mainButton->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
          QGridLayout* mainLay = new QHBoxLayout(this);
          mainLay->setSpacing(0);
          mainLay->setContentsMargins(0,0,0,0);
          mainLay->addWidget(m_mainButton,1,1);
          mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Preferred,QSizePolicy::Expanding),0,1);
          mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Preferred,QSizePolicy::Expanding),2,1);
          mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Expanding,QSizePolicy::Preferred),1,0);
          mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Expanding,QSizePolicy::Preferred),1,2);
          

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          G 1 Reply Last reply
          1
          • VRoninV VRonin

            I think the problem comes the layout in ImagePickButton try

            m_mainButton->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
            QGridLayout* mainLay = new QHBoxLayout(this);
            mainLay->setSpacing(0);
            mainLay->setContentsMargins(0,0,0,0);
            mainLay->addWidget(m_mainButton,1,1);
            mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Preferred,QSizePolicy::Expanding),0,1);
            mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Preferred,QSizePolicy::Expanding),2,1);
            mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Expanding,QSizePolicy::Preferred),1,0);
            mainLay->addItem(new QSpacerItem(1,1,QSizePolicy::Expanding,QSizePolicy::Preferred),1,2);
            
            G Offline
            G Offline
            gabor53
            wrote on last edited by
            #5

            @VRonin
            Thank you. This worked with the following changes:

             QGridLayout* mainLay = new QGridLayout(this);
            
            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