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. QTable that is a QSplitter child does not show vertical scrollbar
Forum Updated to NodeBB v4.3 + New Features

QTable that is a QSplitter child does not show vertical scrollbar

Scheduled Pinned Locked Moved General and Desktop
5 Posts 2 Posters 3.4k Views 1 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.
  • S Offline
    S Offline
    spsingh
    wrote on last edited by
    #1

    I have the following ui, the mainwindow has a horizontal splitter with two children, mDiffTable and mPreviewTable. When I move the splitter to make the mPreviewTable not fit in the ui a vertical scrollbar should appear, But it does not.

    @ mCentralwidget = new QWidget(FusionExplorer);
    mCentralwidget->setObjectName(QString::fromUtf8("mCentralwidget"));
    verticalLayout = new QVBoxLayout(mCentralwidget);
    verticalLayout->setContentsMargins(2, 2, 2, 2);
    verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
    mVerticalSplitter = new QSplitter(mCentralwidget);
    mVerticalSplitter->setObjectName(QString::fromUtf8("mVerticalSplitter"));
    QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(mVerticalSplitter->sizePolicy().hasHeightForWidth());
    mVerticalSplitter->setSizePolicy(sizePolicy);
    mVerticalSplitter->setOrientation(Qt::Horizontal);
    mVerticalSplitter->setHandleWidth(3);
    mExplorer = new QTreeView(mVerticalSplitter);
    mExplorer->setObjectName(QString::fromUtf8("mExplorer"));
    QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Expanding);
    sizePolicy1.setHorizontalStretch(0);
    sizePolicy1.setVerticalStretch(0);
    sizePolicy1.setHeightForWidth(mExplorer->sizePolicy().hasHeightForWidth());
    mExplorer->setSizePolicy(sizePolicy1);
    mExplorer->setUniformRowHeights(true);
    mVerticalSplitter->addWidget(mExplorer);
    mHorizontalSplitter = new QSplitter(mVerticalSplitter);
    mHorizontalSplitter->setObjectName(QString::fromUtf8("mHorizontalSplitter"));
    QSizePolicy sizePolicy2(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
    sizePolicy2.setHorizontalStretch(35);
    sizePolicy2.setVerticalStretch(0);
    sizePolicy2.setHeightForWidth(mHorizontalSplitter->sizePolicy().hasHeightForWidth());
    mHorizontalSplitter->setSizePolicy(sizePolicy2);
    mHorizontalSplitter->setOrientation(Qt::Vertical);
    mHorizontalSplitter->setHandleWidth(3);
    mDiffTable = new QTableView(mHorizontalSplitter);
    mDiffTable->setObjectName(QString::fromUtf8("mDiffTable"));
    QSizePolicy sizePolicy3(QSizePolicy::Expanding, QSizePolicy::Expanding);
    sizePolicy3.setHorizontalStretch(0);
    sizePolicy3.setVerticalStretch(35);
    sizePolicy3.setHeightForWidth(mDiffTable->sizePolicy().hasHeightForWidth());
    mDiffTable->setSizePolicy(sizePolicy3);
    mDiffTable->setSelectionMode(QAbstractItemView::SingleSelection);
    mDiffTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    mDiffTable->setTextElideMode(Qt::ElideNone);
    mDiffTable->setShowGrid(true);
    mHorizontalSplitter->addWidget(mDiffTable);
    mDiffTable->horizontalHeader()->setDefaultSectionSize(335);
    mDiffTable->horizontalHeader()->setMinimumSectionSize(30);
    mDiffTable->horizontalHeader()->setStretchLastSection(true);
    mPreviewTable = new QTableView(mHorizontalSplitter);
    mPreviewTable->setObjectName(QString::fromUtf8("mPreviewTable"));
    QSizePolicy sizePolicy4(QSizePolicy::Expanding, QSizePolicy::Expanding);
    sizePolicy4.setHorizontalStretch(0);
    sizePolicy4.setVerticalStretch(0);
    sizePolicy4.setHeightForWidth(mPreviewTable->sizePolicy().hasHeightForWidth());
    mPreviewTable->setSizePolicy(sizePolicy4);
    mPreviewTable->setStyleSheet(QString::fromUtf8("QAbstractItemView::item QImage {\n"
    " border: 1px solid black\n"
    "}"));
    mPreviewTable->setSelectionMode(QAbstractItemView::NoSelection);
    mPreviewTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    mPreviewTable->setTextElideMode(Qt::ElideNone);
    mPreviewTable->setShowGrid(true);
    mHorizontalSplitter->addWidget(mPreviewTable);
    mPreviewTable->horizontalHeader()->setDefaultSectionSize(335);
    mPreviewTable->horizontalHeader()->setMinimumSectionSize(30);
    mPreviewTable->horizontalHeader()->setStretchLastSection(true);
    mPreviewTable->verticalHeader()->setVisible(false);
    mVerticalSplitter->addWidget(mHorizontalSplitter);

        verticalLayout->addWidget(mVerticalSplitter);
    

    @

    1 Reply Last reply
    0
    • S Offline
      S Offline
      sigrid
      wrote on last edited by
      #2

      I created a complete example based on your code. When I move the splitter down, so that all of mPreviewTable does not fit, then a vertical scrollbar shows up for me. Does the example below reproduce the problem you are having? If not, can you modify it so that it does? That will make it easier to pinpoint what the problem is.

      @#include <QtGui>

      int main(int argc, char** argv)
      {
      QApplication app(argc, argv);
      QMainWindow window;
      QWidget *mCentralwidget = new QWidget(&window);
      window.setCentralWidget(mCentralwidget);

      QVBoxLayout *verticalLayout = new QVBoxLayout(mCentralwidget);
      verticalLayout->setContentsMargins(2, 2, 2, 2);

      QSplitter *mVerticalSplitter = new QSplitter(mCentralwidget);

      QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
      sizePolicy.setHorizontalStretch(0);
      sizePolicy.setVerticalStretch(0);
      sizePolicy.setHeightForWidth(mVerticalSplitter->sizePolicy().hasHeightForWidth());

      mVerticalSplitter->setSizePolicy(sizePolicy);
      mVerticalSplitter->setOrientation(Qt::Horizontal);
      mVerticalSplitter->setHandleWidth(3);

      QTreeView *mExplorer = new QTreeView(mVerticalSplitter);

      QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Expanding);
      sizePolicy1.setHorizontalStretch(0);
      sizePolicy1.setVerticalStretch(0);
      sizePolicy1.setHeightForWidth(mExplorer->sizePolicy().hasHeightForWidth());

      mExplorer->setSizePolicy(sizePolicy1);
      mExplorer->setUniformRowHeights(true);
      mVerticalSplitter->addWidget(mExplorer);

      QSplitter *mHorizontalSplitter = new QSplitter(mVerticalSplitter);
      QSizePolicy sizePolicy2(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
      sizePolicy2.setHorizontalStretch(35);
      sizePolicy2.setVerticalStretch(0);
      sizePolicy2.setHeightForWidth(mHorizontalSplitter->sizePolicy().hasHeightForWidth());

      mHorizontalSplitter->setSizePolicy(sizePolicy2);
      mHorizontalSplitter->setOrientation(Qt::Vertical);
      mHorizontalSplitter->setHandleWidth(3);

      QTableView *mDiffTable = new QTableView(mHorizontalSplitter);

      QSizePolicy sizePolicy3(QSizePolicy::Expanding, QSizePolicy::Expanding);
      sizePolicy3.setHorizontalStretch(0);
      sizePolicy3.setVerticalStretch(35);
      sizePolicy3.setHeightForWidth(mDiffTable->sizePolicy().hasHeightForWidth());

      mDiffTable->setSizePolicy(sizePolicy3);
      mDiffTable->setSelectionMode(QAbstractItemView::SingleSelection);
      mDiffTable->setSelectionBehavior(QAbstractItemView::SelectRows);
      mDiffTable->setTextElideMode(Qt::ElideNone);
      mDiffTable->setShowGrid(true);

      mHorizontalSplitter->addWidget(mDiffTable);
      mDiffTable->horizontalHeader()->setDefaultSectionSize(335);
      mDiffTable->horizontalHeader()->setMinimumSectionSize(30);
      mDiffTable->horizontalHeader()->setStretchLastSection(true);

      QTableView *mPreviewTable = new QTableView(mHorizontalSplitter);
      QStandardItemModel *model = new QStandardItemModel(4, 8);
      for (int row = 0; row < 4; ++row) {
      for (int column = 0; column < 8; ++column) {
      QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
      model->setItem(row, column, item);
      }
      }
      mPreviewTable->setModel(model);

      QSizePolicy sizePolicy4(QSizePolicy::Expanding, QSizePolicy::Expanding);
      sizePolicy4.setHorizontalStretch(0);
      sizePolicy4.setVerticalStretch(0);
      sizePolicy4.setHeightForWidth(mPreviewTable->sizePolicy().hasHeightForWidth());
      mPreviewTable->setSizePolicy(sizePolicy4);
      mPreviewTable->setStyleSheet(QString::fromUtf8("QAbstractItemView::item QImage {\n"
      " border: 1px solid black\n"
      "}"));
      mPreviewTable->setSelectionMode(QAbstractItemView::NoSelection);
      mPreviewTable->setSelectionBehavior(QAbstractItemView::SelectRows);
      mPreviewTable->setTextElideMode(Qt::ElideNone);
      mPreviewTable->setShowGrid(true);

      mHorizontalSplitter->addWidget(mPreviewTable);
      mPreviewTable->horizontalHeader()->setDefaultSectionSize(335);
      mPreviewTable->horizontalHeader()->setMinimumSectionSize(30);
      mPreviewTable->horizontalHeader()->setStretchLastSection(true);
      mPreviewTable->verticalHeader()->setVisible(false);
      mVerticalSplitter->addWidget(mHorizontalSplitter);

      verticalLayout->addWidget(mVerticalSplitter);

      window.show();
      return app.exec();

      }@

      1 Reply Last reply
      0
      • S Offline
        S Offline
        spsingh
        wrote on last edited by
        #3

        It is reproducible in the following code.

        @#include <QtGui>

        class PreviewModel : public QAbstractTableModel
        {
        Q_OBJECT

        public:
        PreviewModel() : QAbstractTableModel() {}
        ~PreviewModel(void) {}

            // Table Model Implementations.
            virtual int rowCount(const QModelIndex &parent) const
            {
               return 1;
            }
            virtual int columnCount(const QModelIndex &parent) const
            {
                return 2;
            }
            virtual QVariant data(const QModelIndex &index, int role) const
            {
                    if (!index.isValid()) {
                            return QVariant();
                    }
        
                    switch(role) {
                            case Qt::DecorationRole:
                                    {
                                        return QVariant(QImage("c:/portrait.jpg"));
                                    }
                            default:
                                    return QVariant();
                    }
            }
            virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const
            {
                    if (role != Qt::DisplayRole) {
                            return QVariant();
                    }
                    if (orientation == Qt::Vertical) {
                            return QVariant();
                    }
        
                    if (section == 0) {
                            return QVariant(QString("LHS Preview"));
                    }
                    else if (section == 1) {
                            return QVariant(QString("RHS Preview"));
                    }
        
                    return QVariant();
            }
        

        };

        int main(int argc, char** argv)
        {
        QApplication app(argc, argv);
        QMainWindow window;
        QWidget *mCentralwidget = new QWidget(&window);
        window.setCentralWidget(mCentralwidget);

        QVBoxLayout *verticalLayout = new QVBoxLayout(mCentralwidget);
        verticalLayout->setContentsMargins(2, 2, 2, 2);

        QSplitter *mVerticalSplitter = new QSplitter(mCentralwidget);

        QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);
        sizePolicy.setHeightForWidth(mVerticalSplitter->sizePolicy().hasHeightForWidth());

        mVerticalSplitter->setSizePolicy(sizePolicy);
        mVerticalSplitter->setOrientation(Qt::Horizontal);
        mVerticalSplitter->setHandleWidth(3);

        QTreeView *mExplorer = new QTreeView(mVerticalSplitter);

        QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Expanding);
        sizePolicy1.setHorizontalStretch(0);
        sizePolicy1.setVerticalStretch(0);
        sizePolicy1.setHeightForWidth(mExplorer->sizePolicy().hasHeightForWidth());

        mExplorer->setSizePolicy(sizePolicy1);
        mExplorer->setUniformRowHeights(true);
        mVerticalSplitter->addWidget(mExplorer);

        QSplitter *mHorizontalSplitter = new QSplitter(mVerticalSplitter);
        QSizePolicy sizePolicy2(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
        sizePolicy2.setHorizontalStretch(35);
        sizePolicy2.setVerticalStretch(0);
        sizePolicy2.setHeightForWidth(mHorizontalSplitter->sizePolicy().hasHeightForWidth());

        mHorizontalSplitter->setSizePolicy(sizePolicy2);
        mHorizontalSplitter->setOrientation(Qt::Vertical);
        mHorizontalSplitter->setHandleWidth(3);

        QTableView *mDiffTable = new QTableView(mHorizontalSplitter);

        QSizePolicy sizePolicy3(QSizePolicy::Expanding, QSizePolicy::Expanding);
        sizePolicy3.setHorizontalStretch(0);
        sizePolicy3.setVerticalStretch(35);
        sizePolicy3.setHeightForWidth(mDiffTable->sizePolicy().hasHeightForWidth());

        mDiffTable->setSizePolicy(sizePolicy3);
        mDiffTable->setSelectionMode(QAbstractItemView::SingleSelection);
        mDiffTable->setSelectionBehavior(QAbstractItemView::SelectRows);
        mDiffTable->setTextElideMode(Qt::ElideNone);
        mDiffTable->setShowGrid(true);

        mHorizontalSplitter->addWidget(mDiffTable);
        mDiffTable->horizontalHeader()->setDefaultSectionSize(335);
        mDiffTable->horizontalHeader()->setMinimumSectionSize(30);
        mDiffTable->horizontalHeader()->setStretchLastSection(true);

        QTableView *mPreviewTable = new QTableView(mHorizontalSplitter);
        // QStandardItemModel *model = new QStandardItemModel(4, 8);
        // for (int row = 0; row < 4; ++row) {
        // for (int column = 0; column < 8; ++column) {
        // QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
        // model->setItem(row, column, item);
        // }
        // }
        // mPreviewTable->setModel(model);

        QSizePolicy sizePolicy4(QSizePolicy::Expanding, QSizePolicy::Expanding);
        sizePolicy4.setHorizontalStretch(0);
        sizePolicy4.setVerticalStretch(0);
        sizePolicy4.setHeightForWidth(mPreviewTable->sizePolicy().hasHeightForWidth());
        mPreviewTable->setSizePolicy(sizePolicy4);
        mPreviewTable->setStyleSheet(QString::fromUtf8("QAbstractItemView::item QImage {\n"
        " border: 1px solid black\n"
        "}"));
        mPreviewTable->setSelectionMode(QAbstractItemView::NoSelection);
        mPreviewTable->setSelectionBehavior(QAbstractItemView::SelectRows);
        mPreviewTable->setTextElideMode(Qt::ElideNone);
        mPreviewTable->setShowGrid(true);

        mHorizontalSplitter->addWidget(mPreviewTable);
        mPreviewTable->horizontalHeader()->setDefaultSectionSize(335);
        mPreviewTable->horizontalHeader()->setMinimumSectionSize(30);
        mPreviewTable->horizontalHeader()->setStretchLastSection(true);
        mPreviewTable->verticalHeader()->setVisible(false);
        mVerticalSplitter->addWidget(mHorizontalSplitter);

        verticalLayout->addWidget(mVerticalSplitter);

        window.show();
        mPreviewTable->setModel(new PreviewModel());
        mPreviewTable->resizeRowsToContents();
        return app.exec();

        }
        @

        1 Reply Last reply
        0
        • S Offline
          S Offline
          sigrid
          wrote on last edited by
          #4

          The problem here is that you only have 1 row and that the default "scrollMode":http://doc.qt.nokia.com/4.7/qabstractitemview.html#ScrollMode-enum is set to QAbstractItemView::ScrollPerItem by default. Therefore, when there is only one item it decides it does not need a scrollbar. Try setting it to

          @mPreviewTable->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);@

          instead. That gives a vertical scrollbar for me when running your example.

          1 Reply Last reply
          0
          • S Offline
            S Offline
            spsingh
            wrote on last edited by
            #5

            Thanks a lot, it works now :)

            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