Mar*_* A. 6 qt image scrollbar qlabel qscrollarea
我在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>
Run Code Online (Sandbox Code Playgroud)
我错过了什么?谢谢.
您是否尝试过遵循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);
Run Code Online (Sandbox Code Playgroud)
然后缩放处理如下:
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)));
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以通过查看示例更好地了解发生的情况,但这就是它的要点。我认为 adjustmentScrollBar() 函数可能对您最有帮助。
您对原始帖子的最后评论是正确的,QScrollArea 不会神奇地注意到其内容大小的变化。看看示例如何使用 adjustmentScrollBar() 来弥补这一事实。
| 归档时间: |
|
| 查看次数: |
11567 次 |
| 最近记录: |