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

有什么想法吗?

有帮助吗?

解决方案

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

看看Trolltech的这个例子:图片查看器实施例

其他提示

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

area->resize(300,300);

如果它在层次结构中,则需要适当地调整顶层(复杂),或者设置该区域的minimumSize。您也可以尝试使用LayoutPolicy - 假设sizeHint是QSize(300,300),您可以根据 https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum

您可以尝试:

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()。

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

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

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

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

例如,您有一个“.ui”在gui上使用QGraphicsView调用文件“qgvImageView”和一个名为“图像”的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有可能对您尝试做的事情做出更好的反应。

如何使用

area->setGeometry(int x, int y, int w, int h);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top