7

我已经在 Qt 中成功实现了一个图像查看器(用于 DICOM)。我可以看到图像,并且可以正确放大和缩小。

现在,如果图像太大而无法在放大时显示,我想查看滚动条。

我用过用户界面。我放置了一个QScrollArea。在里面,QLabelverticalScrollBarPolicyScrollBarAsNeeded。_ Horizo ​​ntalScrollBarPolicyScrollBarAsNeeded

问题是:它不起作用。我放大,但没有出现滚动条。

第二次尝试:使用 QScrollArea 内的布局。

所以现在在 QScrollArea 和 QLabel 之间有一个QWidget :一个水平布局。打开相同的图像,现在我可以在右侧看到一个垂直滚动条。图像从左到右拉伸。当我缩放图像时,它的比例是正确的。

但是...我缩小了滚动条,即使我可以看到整个图像。水平滚动条永远不会出现。

调整 QLabel 的大小似乎没有影响。但是,如果我调整 QScrollArea 的大小(调整主窗口的大小),则会出现水平滚动条。

我一直在检查一些数字:

在 QScrollArea 中

  • 它的大小发生变化:低于 599 宽度(为什么是这个数字?我在任何地方都看不到它)出现水平条。
  • sizeHint()总是返回相同的值:33x41

在 QLabel

  • 尺寸会发生变化,但这并不影响。
  • sizeHint()总是返回相同的值:560x1558

这是来自 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>

我错过了什么?谢谢你。

4

2 回答 2

4

我知道这是一篇旧帖子 - 但如果您或任何人仍有问题,设置QScrollArea::widgetResizable为 false 可能会有所帮助。

至少,当我尝试类似的事情时,我的垂直滚动条总是被禁用(即使我将可滚动小部件的大小设置为大于视口的高度),直到我将其设置为 false。

如果是真的,我认为它会更新可滚动小部件的大小,因此不需要滚动条。这使您可以执行我猜想的示例中的操作,并实现拉伸以适应功能。(实际上我想要做的是适合宽度,只有一个垂直滚动条)

于 2012-08-25T15:20:23.127 回答
2

您是否尝试过遵循Qt 的滚动区域示例?如果您使用 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() 来弥补这一事实。

于 2012-06-11T21:58:08.420 回答