• 9484阅读
  • 2回复

[原创]请问如何判定QScrollArea内容是否到顶或者底 [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-21
我用 QScrollArea 来存放一列控件.
通过上下滚动来显示.

QT似乎没有现成的方法能在区域内任意地方拖动鼠标来滚动内容.
只能通过上下键或者拖动滚动条来滚动内容.

所以我只有重载鼠标事件了.

当鼠标按下事件发生时,判定按下的位置是否属于 QScrollArea 的区域.
是的话,则记录下坐标p.

当鼠标移动事件发生时.当前鼠标坐标p1和之前坐标p的y轴差,为QScrollArea的滚动距离.

但是问题是,滚动是没有界限的,哪怕现在已经在顶部了,依然可以往上滚动.
所以只能判定是否到顶部了来限制滚动.

但是在判定是否到顶的时候,发现没有函数能获得QScrollArea内容是否到顶还是到底了.
只能判断滚动条 QScrollBar是否到达最大值或者最小值.
但是这个滚动条却并不是和内容对齐的.
因为如果我通过QScrollBar的setSliderPosition值来限制滚动的话.
鼠标慢速滚动不会出问题.飞快的滚动,依然会造成越界.

不知道各位有没有完美的方法能够实现这种列表滚动方式?
离线kimtaikee

只看该作者 1楼 发表于: 2011-03-21
就是在QScrollArea中加上两个信号

class MyScrollArea : public QScrollArea
{
   ....

private slots:
    void Fire_TopBottomReached(int value);
    void Fire_LeftRightReached(int value);
signals:
  void sig_TopReached();
  void sig_BottomReached();
  void sig_LeftReached();
  void sig_RightReached();
}

MyScrollArea::MyScrollArea()
{  
   connect(verticalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(Fire_TopBottomReached(int));
   connect(horizontalScrollBar(),SIGNAL(valueChanged(int)),this,SLOT(Fire_LeftRightReached(int));

}

void MyScrollArea::Fire_TopBottomReached(int pos)
{
     if(pos == verticalScrollBar()->minimum())
     {
           emit sig_TopReached();
           return ;
     }

    if(pos == verticalScrollBar()->maximum())
     {
           emti  sig_BottomReached();
            return ;
    }
}

void MyScrollArea::Fire_LeftRightReached(int pos)
{
    if(pos == horizontalScrollBar()->minimum())
    {
             emit sig_LeftReached();
             return ;
      }

     if(horizontalScrollBar()->maximum() == pos)
       {
              emit sig_RightReached();
              return ;
         }
}
    

    
          

离线kimtaikee

只看该作者 2楼 发表于: 2011-03-21
还有,不管是滑到顶部,底部,左部,右部,那么就在QScrollArea中的scrollContentsBy 这个虚函数中添加下面的代码
int vValue = verticalScrollBar()->value();

if(vValue < 0)
{
    vValue = 0;
}else if(vValue>verticalScrollBar()->maximum())
{
    vValue = verticalScrollBar()->maximum();
}
verticalScrollBar()->setValue(vValue);

// 类似的代码同样应用于horizontalScrollBar

快速回复
限100 字节
 
上一个 下一个