我在Qt中成功实现了一个图像查看器(用于DICOM)。 我可以看到图像,我可以正确放大和缩小。
现在,我希望看到滚动条,如果图像太大而无法在放大时显示。
我使用过UI。我放置了一个 QScrollArea 。在里面, QLabel 。 verticalScrollBarPolicy 是 ScrollBarAsNeeded 。 horizontalScrollBarPolicy 是 ScrollBarAsNeeded 。
问题是:它不起作用。我放大了,但没有滚动条出现。
所以现在QScrollArea和QLabel之间有一个 QWidget :水平布局。 打开相同的图像,现在我可以看到右侧的垂直滚动条。图像从左向右拉伸。当我缩放图像得到正确的比例。
但是......我缩小了,滚动条也一样,即使我能看到整个图像。水平滚动条永远不会出现。
调整QLabel的大小似乎没有影响。但是,如果我调整QScrollArea的大小(调整主窗口大小),则会出现水平滚动条。
以下是来自UI设计者的XML代码:
<widget class="QWidget" name="centralWidget">
<property name="autoFillBackground">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>637</width>
<height>649</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="miImagen">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
我错过了什么?谢谢。
答案 0 :(得分:4)
我知道这是一个旧帖子 - 但如果您或任何人仍然遇到问题,将QScrollArea::widgetResizable
设置为false会有所帮助。
至少,当我尝试类似的事情时,我的垂直滚动条总是被禁用(即使我将可滚动窗口小部件的大小设置为高于视口的高度),直到我将其设置为false。
如果是真的,我认为它会更新可滚动小部件的大小,因此不需要滚动条。这允许你在我猜的例子中做它做的事情,并实现一个拉伸到适合的功能。 (实际上我正在尝试做的是适合宽度,只有一个垂直滚动条)
答案 1 :(得分:2)
您是否尝试过关注Qt's scroll area example?如果您使用QLabel来显示图像,那么使用QScrollArea几乎是实现您想要的标准方式。你这样使用它(从例子中):
imageLabel = new QLabel;
imageLabel->setBackgroundRole(QPalette::Base);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
imageLabel->setScaledContents(true);
scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(imageLabel);
setCentralWidget(scrollArea);
然后像这样处理缩放:
void ImageViewer::zoomIn() {
scaleImage(1.25);
}
void ImageViewer::zoomOut() {
scaleImage(0.8);
}
void ImageViewer::scaleImage(double factor)
{
Q_ASSERT(imageLabel->pixmap());
scaleFactor *= factor;
imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());
adjustScrollBar(scrollArea->horizontalScrollBar(), factor);
adjustScrollBar(scrollArea->verticalScrollBar(), factor);
zoomInAct->setEnabled(scaleFactor < 3.0);
zoomOutAct->setEnabled(scaleFactor > 0.333);
}
void ImageViewer::adjustScrollBar(QScrollBar *scrollBar, double factor) {
scrollBar->setValue(int(factor * scrollBar->value()
+ ((factor - 1) * scrollBar->pageStep()/2)));
}
当然,您可以通过查看示例来更好地了解正在发生的事情,但这是它的要点。我想也许adjustScrollBar()函数对你来说可能是最有帮助的。
您对原始帖子的最后评论是正确的,QScrollArea不会神奇地注意到其内容大小的变化。看看该示例如何使用adjustScrollBar()来补偿这一事实。