【问题标题】:How to set an initial size of a QScrollArea?如何设置 QScrollArea 的初始大小?
【发布时间】:2010-09-19 11:04:02
【问题描述】:

我知道这是一个非常具体的 C++ 和 Qt 相关问题,但也许有人可以帮助我,无论如何...

请参阅下面的代码:我想在滚动区域内显示图像。滚动区域的视口应具有定义的初始大小。这意味着,如果图像的大小大于视口的初始大小,则滚动条将可见,否则不可见。

// create label for displaying an image
QImage image( ":/test.png" );
QLabel *label = new QLabel( this );
label->setPixmap( image.toPixmap() );

// put label into scroll area
QScollArea *area = new QScrollArea( this );
area->setWidget( label );

// set the initial size of the view port
// NOTE: This is what I'd like to do, but this method does not exist :(
area->setViewPortSize( QSize( 300, 300 ) );

应该可以调整整个应用程序的大小,以便视口将获得不同于初始大小的大小。

不幸的是,我无法找到如何设置视口的大小。 Qt 的布局机制似乎为视口设置了默认大小,但到目前为止我还无法更改它。使用

设置新尺寸
area->setMinimumSize( QSize( 300, 300 ) );

实际上会设置所需的大小,但随后滚动区域无法调整为小于 300x300 的大小。

有什么想法吗?

【问题讨论】:

    标签: c++ qt scroll widget


    【解决方案1】:

    滚动区域是顶级小部件吗?如果是这样,只需调用

    area->resize(300,300);
    

    如果它在层次结构中,您需要适当调整顶层大小(复杂),或设置区域的 minimumSize。您也可以尝试使用 LayoutPolicy - 假设 sizeHint 为 QSize(300,300) 您可以根据 https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum 中定义的内容为其提供适当的大小策略

    【讨论】:

      【解决方案2】:

      我认为您以错误的方式看待问题。 QScrollArea 只是一个放在框架或 QMainWindow 中的小部件。小部件的大小由包含它的小部件的布局控制。

      看看这个来自奇趣科技的例子:Image Viewer Example

      【讨论】:

        【解决方案3】:

        如何使用

        area->setGeometry(int x, int y, int w, int h);
        

        【讨论】:

          【解决方案4】:

          如果您尝试在滚动区域内显示图像,最好不要使用标签。

          您应该尝试使用 QGraphicsView/QGraphicsScene/QGraphicPixmapItem(而不是滚动区域和标签)。显示图像时性能要好得多。当您使用滚动条四处移动时,滚动区域和标签会非常糟糕地重新绘制图像。

          例如,您有一个“.ui”文件,在 gui 上有一个名为“qgvImageView”的 QGraphicsView 和一个名为“image”的 QImage...

          QGraphicsScene *scene = new QGraphicsScene(qgvImageView);
          QPixmap pixTmp(QPixmap::fromImage(image));
          QGraphicsPixmapItem * ppixItem = scene->addPixmap( pixTmp );
          ppixItem->setPos(0,0);
          

          查看 QT 文档。顺便说一句:这是在 Qt 4.2 中引入的

          我不确定这是否会专门解决问题,但 QGraphicsView 有可能会对您尝试做的事情做出更好的反应。

          【讨论】:

            【解决方案5】:

            你可以试试:

            class MyScrollArea : public QScrollArea
            {
                virtual QSize sizeHint() const { return QSize( 300, 300 ); }
            };
            
            // create label for displaying an image
            QImage image( ":/test.png" );
            Label *label = new QLabel;
            label->setPixmap( image.toPixmap() );
            
            // put label into scroll area
            QScollArea *area = new MyScrollArea( this );
            area->setWidget( label );
            

            但是布局和 Qt 是令人惊讶的巫毒。它是 IMO 功能最少的部分。

            如果这不起作用,请尝试在各种小部件上调用 QWidget::resize()。

            【讨论】:

              【解决方案6】:

              我不认为你可以很容易地做到这一点,即(如果我没看错的话)调整小部件的大小,使内部区域为 300x300。但是,您可能可以捏造它,因为滚动区域是一种框架,它继承自 QWidget。这意味着您可以直接调用 area->resize( 300 + fudge, 300 + fudge ),您的 fudge 值说明了框架绘图占用的额外位。

              不过,我不确定这是否适用于可动态调整大小的对话框。我从来没有做过这样的事情。

              【讨论】:

                猜你喜欢
                • 2018-01-24
                • 2012-07-12
                • 2019-05-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-06-08
                • 1970-01-01
                相关资源
                最近更新 更多