• 15909阅读
  • 10回复

QSlider中怎么设置让鼠标一点就让滚动块马上定位到鼠标点击的地方? [复制链接]

上一主题 下一主题
离线tenggaolong
 
只看楼主 倒序阅读 楼主  发表于: 2008-01-08
— 本帖被 XChinux 执行加亮操作(2008-01-14) —
QSlider中怎么设置让鼠标一点就让滚动块马上定位到鼠标点击的地方?
离线tenggaolong
只看该作者 1楼 发表于: 2008-01-11
已经放了快一个星期了.没人会吗?我已经算出了根据像素而得到slider的value...并把它打印出来...用一个小小测试程序.
MySlider::MySlider(Qt::Orientation orientation, QWidget * parent)
    : QSlider(Qt::Horizontal, parent)
{
    setRange(0,200);
}   

void MySlider::mouseReleaseEvent(QMouseEvent *event)
{
    setRange(0, width());
    setValue(event->x());
}

这样可以点到位置..但我的程序要求是mousePressEvent...改成mousePressEvent后..就可以发现..点击是可以....但不是真正解决问题的方法..往左边点和往右边滚动块显示的位置不对...最大化后再点击会发现更严重的问题...我看了src/widgets/qslider.cpp里面的源码..发现mousePressEvent是有算滚动块与点击地方差值...所以..重载后就不能用了...但..我要的效果就是我们用的千千静听..或者是foobar或者wmp这些播放器的滚动条...一点击就到位...望高人指教!!
离线landuochong
只看该作者 2楼 发表于: 2008-01-14
mousePressEvent.是针对滑块的,改成mousePressEvent就必须重新实现mousePressEvent槽,设法获得鼠标在slider上的位置,然后setValue(int)就可以了
离线landuochong
只看该作者 3楼 发表于: 2008-02-15
已解决。我把它传到个人作品展示中把
离线guyansrg

只看该作者 4楼 发表于: 2008-02-15
呵呵,参考参考
离线allright
只看该作者 5楼 发表于: 2009-01-05
请问楼主,究竟怎么实现啊~能给我参考参考嘛?
菜鸟
离线wd007

只看该作者 6楼 发表于: 2009-01-08
呵呵,学习一下,感谢
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线long5337

只看该作者 7楼 发表于: 2009-01-18
学习学习!!
离线syilong2006
只看该作者 8楼 发表于: 2009-05-11
老大把您的作品给发给我看看嘛!
e_mail:syilong@126.com
离线jiaoxing3
只看该作者 9楼 发表于: 2010-11-26
Re:QSlider中怎么设置让鼠标一点就让滚动块马上定位到鼠标点击的地方?无副作用
可以使用事件过滤,代码如下
switch(event->type())
{      
case QEvent::MouseButtonPress:
            {
                if(((QMouseEvent *)event)->button() == Qt::LeftButton)
                {
                    int max = ((QSlider*)obj)->maximum();
                    int min = ((QSlider*)obj)->minimum();
                    int pointPos = ((double)((QMouseEvent *)event)->x()) / ((QSlider*)obj)->width()*(max - min)+min;
                    if(abs(pointPos - ((QSlider*)obj)->value())> (((QSlider*)obj)->pageStep()) )
                    {
                        ((QSlider*)obj)->setValue(pointPos);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                    return false;
           }
}
这样,在滑块与鼠标距离很近时(小于pageStep),return false使用QSlider默认的点击处理,距离比较大时(大于pageStep),自己手动处理,避免了很近时点击乱动的现象
离线gintonic

只看该作者 10楼 发表于: 2017-05-14
回 jiaoxing3 的帖子
jiaoxing3:可以使用事件过滤,代码如下
switch(event->type())
{      
case QEvent::MouseButtonPress:
            {
....... (2010-11-26 16:14) 

你好,你这个代码在水平slider里可以用,在垂直的slider里就用不了了,我把代码中的x改成y,width改成height也还是不成功,你知道应该怎么改么
快速回复
限100 字节
 
上一个 下一个