如何设置QScrollArea的初始大小?

3

我知道这是一个非常特定的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的能力。

有什么想法吗?

6个回答

2
滚动区域是顶层小部件吗?如果是,则只需调用
area->resize(300,300);

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

2
你可以尝试以下方法:
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真是神秘莫测。在我看来,这是它最不实用的部分。

如果那样行不通,请尝试在各种小部件上调用QWidget::resize()。


2
我认为您的问题出在了错误的方向上。QScrollArea只是一个小部件,您需要将其放置在框架或QMainWindow中。小部件的大小由包含它的小部件的布局控制。
请参考Trolltech的这个示例:图像查看器示例

0

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

您应该尝试使用QGraphicsView/QGraphicsScene/QGraphicPixmapItem(而不是滚动区域和标签)。显示图像时性能更好。当您使用滚动条移动时,滚动区域和标签会重新绘制图像,效果非常差。

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

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

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

我不确定这是否会特别解决问题,但是QGraphicsView有可能会更好地响应您尝试做的事情。


0

使用怎么样?

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

0

我认为你很难做到完全相同的效果,也就是(如果我读得正确的话),调整小部件的大小使其内部区域为300x300。不过你或许可以通过一些折衷方法来实现,因为滚动区域是类型框架的一种,它继承自QWidget。这意味着你可以只需调用area->resize( 300 + fudge, 300 + fudge ),其中fudge值考虑了框架绘制所占据的额外空间。

然而,我不确定在动态可调整对话框中是否有效。我从未进行过类似的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接