如何设置QScrollArea的初始大小?

时间:2008-10-27 19:33:16

标签: c++ qt scroll widget

我知道这是一个非常具体的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 个答案:

答案 0 :(得分:2)

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

看看Trolltech的这个例子:Image Viewer Example

答案 1 :(得分:2)

滚动区域是顶级窗口小部件吗?如果是这样,只需致电

area->resize(300,300);

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

答案 2 :(得分:1)

您可以尝试:

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令人惊讶的是Voodoo。这是IMO最不起作用的部分。

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

答案 3 :(得分:0)

我认为你不能轻易做到这一点,这是(如果我正确阅读),调整小部件的大小,使内部区域为300x300。但是,您可能能够捏造它,因为滚动区域是一种框架,它继承自QWidget。这意味着你可以只调用area->resize( 300 + fudge, 300 + fudge ),其中你的软糖价值占框架图纸占用的额外位数。

但是,我不确定这会在动态可调整大小的对话框中有效。我没有做过这样的事情。

答案 4 :(得分:0)

如果您尝试在滚动区域内显示图像,那么最好的选择是不使用标签。

您应该尝试使用QGraphicsView / QGraphicsScene / QGraphicPixmapItem(而不是Scroll Area和label)。显示图像时性能要好得多。当您使用滚动条移动时,滚动区域和标签将重新绘制图像。

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

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

查看QT文档。 BTW:这是在Qt 4.2中引入的

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

答案 5 :(得分:0)

如何使用

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