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 的大小的能力。

有任何想法吗?

4

6 回答 6

2

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

看看这个来自 Trolltech 的示例:图像查看器示例

于 2008-10-30T20:13:45.660 回答
2

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

area->resize(300,300);

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

于 2009-01-02T19:52:20.630 回答
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 是惊人的巫毒。它是 IMO 功能最少的部分。

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

于 2008-10-30T14:00:07.990 回答
0

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

但是,我不确定这是否可以在动态调整大小的对话框中工作。我从来没有做过这样的事情。

于 2008-10-28T14:36:53.237 回答
0

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

您应该尝试使用 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 有可能对您尝试做的事情做出更好的反应。

于 2008-11-04T22:46:12.010 回答
0

怎么用

area->setGeometry(int x, int y, int w, int h);
于 2009-01-03T19:00:46.677 回答