QLabel表示QScrollArea内部的图像(QLabel showing an image i

2019-09-18 00:42发布

我已经成功地在Qt中实现的图像浏览器(用于DICOM)。 我能看到图像,我可以放大和缩小正确。

现在,我想看到滚动条如果图像太大表明,当我放大。

我使用的UI。 我放在QScrollArea。 内饰方面,QLabel。verticalScrollBarPolicyScrollBarAsNeeded。horizo​​ntalScrollBarPolicyScrollBarAsNeeded。

问题是:这是行不通的。 我放大,但没有出现滚动条。

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

所以,现在还有的QScrollArea和QLabel之间一个QWidget:水平布局。 打开相同的图像,现在我可以看到右侧的垂直滚动条。 该图像是由左streched向右。 当我缩放图像获取其正确的比例。

但是......我缩小和滚动条是一样的,即使我可以看到整个图像。 从未出现水平滚动条。

调整的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>

我在想什么? 谢谢。

Answer 1:

我知道这是旧的文章-但如果你或任何人仍然有一个问题,它可能会帮助设置QScrollArea::widgetResizable为false。

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

如果这是真的,我想它会更新滚动部件的大小,因此不应该需要滚动条。 这允许你做它在我猜的例子,并实施拉伸以适应的功能。 (其实我想要做的是适合宽度,只有垂直滚动条)



Answer 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()来补偿这个事实。



文章来源: QLabel showing an image inside a QScrollArea