我想让滑块跳到那个位置,而不是在用户单击slider的时候跳到那个位置。如何实现这一点?
发布于 2012-06-21 14:56:02
好吧,我怀疑Qt有一个直接的功能来达到这个目的。
尝试使用自定义窗口小部件。这应该行得通!
尝试以下逻辑
class MySlider : public QSlider
{
protected:
void mousePressEvent ( QMouseEvent * event )
{
if (event->button() == Qt::LeftButton)
{
if (orientation() == Qt::Vertical)
setValue(minimum() + ((maximum()-minimum()) * (height()-event->y())) / height() ) ;
else
setValue(minimum() + ((maximum()-minimum()) * event->x()) / width() ) ;
event->accept();
}
QSlider::mousePressEvent(event);
}
};发布于 2014-10-09 22:54:50
在所有版本的@spyke、@Massimo Callegari和@Ben (滑块位置对于整个区域都不正确)出现问题后,我在QSlider源代码:QStyle::SH_Slider_AbsoluteSetButtons中发现了一些Qt风格的功能。
您必须创建一个新的QStyle,这可能非常烦人,或者您可以使用ProxyStyle,如http://www.qtcentre.org/threads/9208-QSlider-step-customize?p=49035#post49035中的用户jpn所示
我添加了另一个构造函数并修复了一个拼写错误,但使用了原始源代码的其余部分。
#include <QProxyStyle>
class MyStyle : public QProxyStyle
{
public:
using QProxyStyle::QProxyStyle;
int styleHint(QStyle::StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const
{
if (hint == QStyle::SH_Slider_AbsoluteSetButtons)
return (Qt::LeftButton | Qt::MidButton | Qt::RightButton);
return QProxyStyle::styleHint(hint, option, widget, returnData);
}
};现在可以在滑块构造函数中设置滑块的样式(如果滑块派生自QSlider):
setStyle(new MyStyle(this->style()));或者,如果它是一个标准的QSlider,它应该是这样工作的:
standardSlider.setStyle(new MyStyle(standardSlider->style()));因此,您使用该元素的原始样式,但是如果请求QStyle::SH_Slider_AbsoluteSetButtons "property“,则可以按您所需的方式返回;)
也许你将不得不在删除滑块时销毁这些代理样式,还没有测试。
发布于 2013-03-09 23:12:50
我也需要这个,并尝试了spyke解决方案,但它缺少两个东西:
所以,下面是复查过的代码:
void MySlider::mousePressEvent ( QMouseEvent * event )
{
QStyleOptionSlider opt;
initStyleOption(&opt);
QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
if (event->button() == Qt::LeftButton &&
sr.contains(event->pos()) == false)
{
int newVal;
if (orientation() == Qt::Vertical)
newVal = minimum() + ((maximum()-minimum()) * (height()-event->y())) / height();
else
newVal = minimum() + ((maximum()-minimum()) * event->x()) / width();
if (invertedAppearance() == true)
setValue( maximum() - newVal );
else
setValue(newVal);
event->accept();
}
QSlider::mousePressEvent(event);
}https://stackoverflow.com/questions/11132597
复制相似问题