Qt QSlider点击和拖动

终于有时间写点东西了~~自从毕业到现在,才做了不到两个月的工作辞掉了,为了自己的兴趣,在这里鼓励有强烈追求的人勇敢的做自己想做的事,做自己喜欢的工作!

来到一个新公司,老大要求用qt还有opengl做一个yuv播放器,完全没接触过这些,不过经过自己的努力在半个多月还是弄出来了~问题众多,下面就Qt的QSlider遇到的问题来讲讲希望对新手有点帮助!

在Qt中Qslider的单击并不是直接移动到点击的位置,而是每点一次移动一步。这在给播放器的体验效果很差,所以很是有必要自己来实现。但是必须注意到的一个问题是QSlider的拖动,如果处理不好点击和拖动会冲突造成功能失效。处理这个问题可以从QSlider继承过来,重新实现鼠标点击事件,可以重新实现鼠标按下或者释放这个事件来完成这个效果。建议重新实现鼠标左键按下的事件。废话说多了,上代码把:

class SliderClick : public QSlider
{
public:
    SliderClick(QWidget *parent = 0) : QSlider(parent)
    {
    }
protected:
    void mousePressEvent(QMouseEvent *ev)
    {
        //注意应先调用父类的鼠标点击处理事件,这样可以不影响拖动的情况
        QSlider::mousePressEvent(ev);
        //获取鼠标的位置,这里并不能直接从ev中取值(因为如果是拖动的话,鼠标开始点击的位置没有意义了)
        double pos = ev->pos().x() / (double)width();
        setValue(pos * (maximum() - minimum()) + minimum());
        //向父窗口发送自定义事件event type,这样就可以在父窗口中捕获这个事件进行处理
        QEvent evEvent(static_cast<QEvent::Type>(QEvent::User + 1));
        QCoreApplication::sendEvent(parentWidget(), &evEvent);
    }
};


在自定义的event中,type必须是大于或者等于QEvent::User。一个很好的做法是定义枚举类型:

typedef enum _MYEVENT_
{
    QEvent::User,
    MYEVENTA,
    MYEVENTB
}MYEVENT;

 
 

之后直接使用就可以了,避免冲突。

上面是点击的事件改造,在使用的时候还是可以用designer设计,在生成的.h文件中找到QSlider的部分,用new SliderClick(parent),即可~~

最后一并写上全屏的问题吧,QWidget窗口化之后也就是全屏播放,这时候双击退出这个事件在QWidget所属的窗口不能被捕获,可能是窗口化之后不属于任何一个父窗口,所以不会像父窗口发送双击事件(不知道是不是这样,期望高手解释一下!)。解决的办法可以仿照上面的例子重载QWidget的双击事件~~,代码就不贴了,和上面的很类似的!

猜你喜欢

转载自blog.csdn.net/T20091/article/details/14645241