📄 qscrollview.html
字号:
QScrollView* sv = new QScrollView(...);
<a href="qlabel.html">QLabel</a>* child1 = new <a href="qlabel.html">QLabel</a>("CHILD", sv-><a href="#viewport">viewport</a>());
sv-><a href="#addChild">addChild</a>(child1);
<a href="qlabel.html">QLabel</a>* child2 = new <a href="qlabel.html">QLabel</a>("CHILD", sv-><a href="#viewport">viewport</a>());
sv-><a href="#addChild">addChild</a>(child2);
<a href="qlabel.html">QLabel</a>* child3 = new <a href="qlabel.html">QLabel</a>("CHILD", sv-><a href="#viewport">viewport</a>());
sv-><a href="#addChild">addChild</a>(child3);
</pre>
这里,QScrollView有同样的四个孩子:viewport()、<a href="#verticalScrollBar">verticalScrollBar</a>()、<a href="#horizontalScrollBar">horizontalScrollBar</a>()和一个小的<a href="#cornerWidget">cornerWidget</a>()。<a href="#viewport">viewport</a>()有三个<a href="qlabel.html">QLabel</a>对象作为子窗口部件。当视图被滚动,滚动视图会分别移动这些子窗口部件。
<p> <h3> 使用一个放置很多窗口部件的非常大的视图
<a name="enableclipper"></a>
<img src=qscrollview-cl.png>
</h3>
<a name="1-2"></a><p> QScrollView的最后一个用法(就像上面描述的)适合有很多窗口部件的任何一个维度超过4000像素的非常大的滚动区域。在这种用法中,你可以调用<a href="#resizeContents">resizeContents</a>()来设置区域的大小并且重新实现<a href="#drawContents">drawContents</a>()来绘制内容。然后你调用<a href="#enableClipper">enableClipper</a>(TRUE)并且添加窗口部件,再一次把它们作为viewport()的孩子并且通过<a href="#addChild">addChild</a>()添加它们:
<pre>
QScrollView* sv = new QScrollView(...);
sv-><a href="#enableClipper">enableClipper</a>(TRUE);
<a href="qlabel.html">QLabel</a>* child1 = new <a href="qlabel.html">QLabel</a>("CHILD", sv-><a href="#viewport">viewport</a>());
sv-><a href="#addChild">addChild</a>(child1);
<a href="qlabel.html">QLabel</a>* child2 = new <a href="qlabel.html">QLabel</a>("CHILD", sv-><a href="#viewport">viewport</a>());
sv-><a href="#addChild">addChild</a>(child2);
<a href="qlabel.html">QLabel</a>* child3 = new <a href="qlabel.html">QLabel</a>("CHILD", sv-><a href="#viewport">viewport</a>());
sv-><a href="#addChild">addChild</a>(child3);
</pre>
<p> 这里,QScrollView有四个孩子:<a href="#clipper">clipper</a>()(这次不是<a href="#viewport">viewport</a>())、<a href="#verticalScrollBar">verticalScrollBar</a>()、<a href="#horizontalScrollBar">horizontalScrollBar</a>()和一个小的<a href="#cornerWidget">cornerWidget</a>()。clipper()有一个孩子:viewport()。viewport()有同样的三个标签作为子窗口部件。当视图被滚动时,viewport()被移动,它的孩子就像通常的子窗口部件那样被移动。
<p> <a name="allviews"></a>
<h3> 有关所有视图的详细资料
</h3>
<a name="1-3"></a><p> 如果你想在视图中使用任何子窗口部件,通常你将使用三种方法中的第一种。
<p> 注意你在滚动区域中看到的窗口部件是viewport()窗口部件,不是QScrollView本身。所以例如如果要打开鼠标跟踪,请使用viewport()->setMouseTracking(TRUE)。
<p> 为了使拖放生效,你应该在QScrollView上使用<a href="qwidget.html#setAcceptDrops">setAcceptDrops</a>(TRUE)(因为拖放事件被传送给父对象)。但是为了算出在视图中的合理位置,你将需要把拖动坐标从相对于QScrollView映射到相对于内容,为了做到这点使用<a href="#viewportToContents">viewportToContents</a>()函数。
<p> 为了在滚动区域中处理鼠标事件,就像继承其它窗口部件那样继承滚动视图,但是不要重新实现<a href="qwidget.html#mousePressEvent">mousePressEvent</a>(),请重新实现<a href="#contentsMousePressEvent">contentsMousePressEvent</a>()来替代它。内容特定事件处理器提供滚动视图坐标系统中的转换事件。如果你重新实现mousePressEvent(),你将只会当QScrollView的部分被点击时得到调用——并且这个唯一的部分就是那个“角”(如果你没有设置<a href="#cornerWidget">cornerWidget</a>())和框架,其它的任何事物都被视口、clipper或者滚动条隐藏。
<p> 当你构造一个QScrollView,一些窗口部件标记应用于<a href="#viewport">viewport</a>()而不是被发送给QScrollView中<a href="qwidget.html">QWidget</a>的构造函数。这适用于<a href="qt.html#WidgetFlags-enum">WResizeNoErase</a>、<a href="qt.html#WidgetFlags-enum">WStaticContents</a>、<a href="qt.html#WidgetFlags-enum">WRepaintNoErase</a>和<a href="qt.html#WidgetFlags-enum">WPaintClever</a>。关于这些标记请参考<a href="qt.html#WidgetFlags-enum">Qt::WidgetFlags</a>文档。这里有一些实例:
<p> <ul>
<p> <li> 一个操作图像的窗口部件将使用<tt>WResizeNoErase|WStaticContents</tt>,因为当它的大小增加时,这个窗口部件自己绘制所有的像素,它对于新的部分只需要一个绘制事件,因为旧的部分保持不变。
<p> <li> 一个字处理窗口部件也许使用<a href="qt.html#WidgetFlags-enum">WResizeNoErase</a>并且一行一行地重新绘制自己来得到比较少闪烁的重定义大小。如果这个窗口部件处在没有文本合理化发生的模式中,它也可以使用<a href="qt.html#WidgetFlags-enum">WStaticContents</a>,这样它对于新的可视部分只得到一个重绘。
<p> <li> 一个当任务移动时背景滚动的滚动游戏窗口部件也许使用<a href="qt.html#WidgetFlags-enum">WRepaintNoErase</a>(除了<a href="qt.html#WidgetFlags-enum">WStaticContents</a>和<a href="qt.html#WidgetFlags-enum">WResizeNoErase</a>之外),这样在滚动进入和滚动退出期间窗口系统背景不闪烁。
</ul>
<p> 子窗口部件可以使用<a href="#addChild">addChild</a>()或<a href="#moveChild">moveChild</a>()来移动。使用<a href="#childX">childX</a>()和<a href="#childY">childY</a>()来得到子窗口部件的位置。
<p> 一个窗口部件可以通过<a href="#setCornerWidget">setCornerWidget</a>()被放置到垂直滚动条和水平滚动条之间的角里。你可以使用<a href="#horizontalScrollBar">horizontalScrollBar</a>()和<a href="#verticalScrollBar">verticalScrollBar</a>()获得到滚动条的访问,并且使用<a href="#viewport">viewport</a>()来得到视口。滚动视图可以使用<a href="#scrollBy">scrollBy</a>()、<a href="#ensureVisible">ensureVisible</a>()、<a href="#setContentsPos">setContentsPos</a>()或<a href="#center">center</a>()来被滚动。
<p> 可视区域由<a href="#visibleWidth">visibleWidth</a>()和<a href="#visibleHeight">visibleHeight</a>()给定,并且内容区域由<a href="#contentsWidth">contentsWidth</a>()和<a href="#contentsHeight">contentsHeight</a>()给定。内容可以使用<a href="#repaintContents">repaintContents</a>()或<a href="#updateContents">updateContents</a>()之一来重新绘制。
<p> 坐标转换由<a href="#contentsToViewport">contentsToViewport</a>()和<a href="#viewportToContents">viewportToContents</a>()提供。
<p> <a href="#contentsMoving">contentsMoving</a>()信号正好在内容被移动到新位置之前被发射。
<p> <b>警告:</b><a href="qt.html#WidgetFlags-enum">WResizeNoErase</a>是当前的默认设置,也就是说你在滚动视图的子类中一直不得不手工清除背景。这一点将在Qt的未来版本中发生改变并且我们推荐明确地指定这个标记。
<p> <img src=qscrollview-m.png> <img src=qscrollview-w.png>
<p>也可以参考<a href="abstractwidgets.html">抽象窗口部件类</a>。
<hr><h2>成员类型文档</h2>
<h3 class=fn><a name="ResizePolicy-enum"></a>QScrollView::ResizePolicy</h3>
<p> 这个枚举类型用来控制QScrollView对重新定义大小事件的反应。这里有四个可能的设置:
<ul>
<li><tt>QScrollView::Default</tt> - QScrollView当它不得不选择时,它自动地选择其它设置中的一个。在Qt的这个版本中,如果你使用<a href="#resizeContents">resizeContents</a>()重新定义内容的大小,QScrollView改变为<a href="#ResizePolicy-enum">Manual</a>,如果一个孩子被添加,改变为<a href="#ResizePolicy-enum">AutoOne</a>。
<li><tt>QScrollView::Manual</tt> - 视图保持为resizeContents()设定的大小。
<li><tt>QScrollView::AutoOne</tt> - 如果只有一个子窗口部件,视图保持为那个窗口部件的大小,否则这个行为是未定义的。
<li><tt>QScrollView::AutoOneFit</tt> - 如果只有一个子窗口部件,视图保持为那个窗口部件的<a href="qwidget.html#sizeHint">sizeHint</a>()。如果滚动视图被重新定义为大于孩子的sizeHint()的大小时,孩子将被重新定义大小适合它。如果超过一个孩子,这个行为是未定义的。
</ul><p>
<h3 class=fn><a name="ScrollBarMode-enum"></a>QScrollView::ScrollBarMode</h3>
<p> 这个枚举变量描述QScrollView的滚动条的不同模式。定义的模式有:
<ul>
<li><tt>QScrollView::Auto</tt> - 当内容大于所要适合的QScrollView,它显示滚动条,并且否则就不显示。这是默认值。
<li><tt>QScrollView::AlwaysOff</tt> - QScrollView从不显示滚动条。
<li><tt>QScrollView::AlwaysOn</tt> - QScrollView一直显示显示滚动条。。
</ul><p> (对于水平和垂直滚动条的模式是互相独立的。)
<hr><h2>成员函数文档</h2>
<h3 class=fn><a name="QScrollView"></a>QScrollView::QScrollView ( <a href="qwidget.html">QWidget</a> * parent = 0, const char * name = 0, WFlags f = 0 )
</h3>
<p> 构造一个使用<em>parent</em>、<em>name</em>和窗口部件标记<em>f</em>的QScrollView。
<p> 这个窗口部件标记<a href="qt.html#WidgetFlags-enum">WStaticContents</a>、 <a href="qt.html#WidgetFlags-enum">WRepaintNoErase</a>和<a href="qt.html#WidgetFlags-enum">WPaintClever</a>被传递给<a href="#viewport">viewport</a>()窗口部件。其它窗口部件标记就像通常一样传递给父对象的构造函数。
<h3 class=fn><a name="~QScrollView"></a>QScrollView::~QScrollView ()
</h3>
销毁这个QScrollView。任何通过<a href="#addChild">addChild</a>()添加的孩子都将被删除。
<h3 class=fn>void <a name="addChild"></a>QScrollView::addChild ( <a href="qwidget.html">QWidget</a> * child, int x = 0, int y = 0 )<tt> [虚]</tt>
</h3>
插入窗口部件<em>child</em>到滚动区域的(<em>x</em>, <em>y</em>)位置。位置默认为(0, 0)。如果这个孩子已经在视图中存在,它只被移动。
<p> 如果你添加大量的窗口部件,你也许要调用<a href="#enableClipper">enableClipper</a>(TRUE)。
<p>例如:<a href="scrollview-example.html#x732">scrollview/scrollview.cpp</a>。
<h3 class=fn>int <a name="bottomMargin"></a>QScrollView::bottomMargin () const<tt> [保护]</tt>
</h3>
返回下边距。
<p>也可以参考<a href="#setMargins">setMargins</a>()。
<h3 class=fn>void <a name="center"></a>QScrollView::center ( int x, int y )<tt> [槽]</tt>
</h3>
滚动内容,这样<em>(x, y)</em>点在可视区域中央。
<p>实例:<a href="scrollview-example.html#x733">scrollview/scrollview.cpp</a>。
<h3 class=fn>void <a name="center-2"></a>QScrollView::center ( int x, int y, float xmargin, float ymargin )<tt> [槽]</tt>
</h3>
这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。
<p> 滚动内容,这样<em>(x, y)</em>点在<em>xmargin</em>和<em>ymargin</em>为边缘(作为可视区域)的范围内可视。
<p> 实例:
<ul>
<li> 边缘0.0允许(x, y)在可视区域的边缘。
<li> 边缘0.5确保(x, y)在可视区域的中间50%内。
<li> 边缘1.0确保(x, y)在可视区域的中央。
</ul>
<h3 class=fn>bool <a name="childIsVisible"></a>QScrollView::childIsVisible ( <a href="qwidget.html">QWidget</a> * child )
</h3>
<b>这个函数是废弃的。</b>它的提供只是为了保证旧代码能够工作。我们强烈建议在新代码中不要使用它。
<p> 如果<em>child</em>是可视的,返回真。这和child->isVisible()一致。
<h3 class=fn>int <a name="childX"></a>QScrollView::childX ( <a href="qwidget.html">QWidget</a> * child )
</h3>
返回给定的<em>child</em>窗口部件的X位置。对于已经添加到视图中的窗口部件,请使用这个而不是<a href="qwidget.html#x">QWidget::x</a>()。
<h3 class=fn>int <a name="childY"></a>QScrollView::childY ( <a href="qwidget.html">QWidget</a> * child )
</h3>
返回给定的<em>child</em>窗口部件的Y位置。对于已经添加到视图中的窗口部件,请使用这个而不是<a href="qwidget.html#y">QWidget::y</a>()。
<h3 class=fn><a href="qwidget.html">QWidget</a> * <a name="clipper"></a>QScrollView::clipper () const
</h3>
返回clipper窗口部件。滚动视图中的内容最终被省略来进入clipper窗口部件。
<p> <p>也可以参考<a href="#visibleWidth-prop">visibleWidth</a>和<a href="#visibleHeight-prop">visibleHeight</a>。
<h3 class=fn>void <a name="contentsContextMenuEvent"></a>QScrollView::contentsContextMenuEvent ( <a href="qcontextmenuevent.html">QContextMenuEvent</a> * e )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#contextMenuEvent">contextMenuEvent</a>(),这个事件处理器就被调用——鼠标位置被转换为内容中的一个点。
<p>实例:<a href="tutorial2-06.html#x2489">chart/canvasview.cpp</a>。
<h3 class=fn>void <a name="contentsDragEnterEvent"></a>QScrollView::contentsDragEnterEvent ( <a href="qdragenterevent.html">QDragEnterEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#dragEnterEvent">dragEnterEvent</a>(),这个事件处理器就被调用——拖动位置被转换为内容中的一个点。
<p>在<a href="qtable.html#contentsDragEnterEvent">QTable</a>中被重新实现。
<h3 class=fn>void <a name="contentsDragLeaveEvent"></a>QScrollView::contentsDragLeaveEvent ( <a href="qdragleaveevent.html">QDragLeaveEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#dragLeaveEvent">dragLeaveEvent</a>(),这个事件处理器就被调用——拖动位置被转换为内容中的一个点。
<p>在<a href="qtable.html#dragLeaveEvent">QTable</a>中被重新实现。
<h3 class=fn>void <a name="contentsDragMoveEvent"></a>QScrollView::contentsDragMoveEvent ( <a href="qdragmoveevent.html">QDragMoveEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#dragMoveEvent">dragMoveEvent</a>(),这个事件处理器就被调用——拖动位置被转换为内容中的一个点。
<p>在<a href="qtable.html#dragMoveEvent">QTable</a>中被重新实现。
<h3 class=fn>void <a name="contentsDropEvent"></a>QScrollView::contentsDropEvent ( <a href="qdropevent.html">QDropEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#dropEvent">dropEvent</a>(),这个事件处理器就被调用——放下位置被转换为内容中的一个点。
<p>在<a href="qtable.html#dropEvent">QTable</a>中被重新实现。
<h3 class=fn>int <a name="contentsHeight"></a>QScrollView::contentsHeight () const
</h3>
<p>返回内容区域的高度。详细情况请参考<a href="qscrollview.html#contentsHeight-prop">“contentsHeight”</a>属性。
<h3 class=fn>void <a name="contentsMouseDoubleClickEvent"></a>QScrollView::contentsMouseDoubleClickEvent ( <a href="qmouseevent.html">QMouseEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#mouseDoubleClickEvent">mouseDoubleClickEvent</a>(),这个事件处理器就被调用——点击位置被转换为内容中的一个点。
<p>在<a href="qlistview.html#contentsMouseDoubleClickEvent">QListView</a>中被重新实现。
<h3 class=fn>void <a name="contentsMouseMoveEvent"></a>QScrollView::contentsMouseMoveEvent ( <a href="qmouseevent.html">QMouseEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#mouseMoveEvent">mouseMoveEvent</a>(),这个事件处理器就被调用——鼠标位置被转换为内容中的一个点。
<p>实例:<a href="canvas-example.html#x2726">canvas/canvas.cpp</a>和<a href="tutorial2-06.html#x2490">chart/canvasview.cpp</a>。
<p>在<a href="qlistview.html#contentsMouseMoveEvent">QListView</a>中被重新实现。
<h3 class=fn>void <a name="contentsMousePressEvent"></a>QScrollView::contentsMousePressEvent ( <a href="qmouseevent.html">QMouseEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#mousePressEvent">mousePressEvent</a>(),这个事件处理器就被调用——按下位置被转换为内容中的一个点。
<p>实例:<a href="canvas-example.html#x2727">canvas/canvas.cpp</a>和<a href="tutorial2-06.html#x2491">chart/canvasview.cpp</a>。
<p>在<a href="qlistview.html#contentsMousePressEvent">QListView</a>中被重新实现。
<h3 class=fn>void <a name="contentsMouseReleaseEvent"></a>QScrollView::contentsMouseReleaseEvent ( <a href="qmouseevent.html">QMouseEvent</a> * )<tt> [虚 保护]</tt>
</h3>
只要QScrollView收到<a href="qwidget.html#mouseReleaseEvent">mouseReleaseEvent</a>(),这个事件处理器就被调用——释放位置被转换为内容中的一个点。
<p>在<a href="qlistview.html#contentsMouseReleaseEvent">QListView</a>中被重新实现。
<h3 class=fn>void <a name="contentsMoving"></a>QScrollView::contentsMoving ( int x, int y )<tt> [signal]</tt>
</h3>
<p> 这个信号正好在内容被移动到<em>(x, y)</em>位置之前被发射。
<p> <p>也可以参考<a href="#contentsX-prop">contentsX</a>和<a href="#contentsY-prop">contentsY</a>。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -