- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个滚动条,它后面有一个 slider ,用于保存用户保存的最后一个值。为了更好地解释我的目的,我创建了下面的图片。
在图像中,中间的 slider 应该保存用户应用的最后一个值,而顶部的主 slider 可以自由拖动。换句话说,不能选择中间的一个,当用户按下按钮或其他东西时,它的值将更改为另一个的值。
到目前为止,我已经尝试了以下方法,但没有成功:
创建一个继承自QScrollBar的类,并在里面添加另一个QScrollBar。
滚动条.h
#ifndef SCROLLBAR_H
#define SCROLLBAR_H
#include <QScrollBar>
class ScrollBar : public QScrollBar
{
Q_OBJECT
public:
ScrollBar ( Qt::Orientation orientation, QWidget * parent = 0 );
void init();
void update();
private:
QScrollBar* subslider;
};
#endif // SCROLLBAR_H
滚动条.cpp
#include "scrollbar.h"
ScrollBar::ScrollBar( Qt::Orientation orientation, QWidget * parent ) :
QScrollBar (orientation, parent) {
subslider = new QScrollBar(orientation, this);
}
void ScrollBar::init() {
subslider->setMaximum( QScrollBar::maximum() );
subslider->setMinimum( QScrollBar::minimum() );
subslider->setFixedSize( QScrollBar::size() );
subslider->setValue( QScrollBar::minimum() );
subslider->setEnabled(false);
subslider->setVisible(true);
}
void ScrollBar::update() {
subslider->setValue( QScrollBar::sliderPosition() );
}
创建一个继承自 QScrollBar 的类,并使用 paintEvent
添加另一个 slider 。
滚动条.h
#ifndef SCROLLBAR_H
#define SCROLLBAR_H
#include <QScrollBar>
#include <QPaintEvent>
class ScrollBar : public QScrollBar
{
Q_OBJECT
public:
ScrollBar ( Qt::Orientation orientation, QWidget * parent = 0 );
void update();
private:
int scrollbar_pos;
signals:
protected:
void paintEvent( QPaintEvent* event );
};
#endif // SCROLLBAR_H
滚动条.cpp
#include "scrollbar.h"
#include <QPainter>
ScrollBar::ScrollBar( Qt::Orientation orientation, QWidget * parent ) :
QScrollBar (orientation, parent) {
scrollbar_pos = 0;
}
void ScrollBar::update() {
subslider_pos = QScrollBar::sliderPosition();
}
void ScrollBar::paintEvent(QPaintEvent * event) {
// This calls the base class's paint calls
QScrollBar::paintEvent(event);
// The following is painted on top of it
QPainter p(this);
/**
* I think the code here should get the image used to display the slider
* and put it on the correct position.
*/
}
最佳答案
我设法使用不同的方法解决了这个问题。我使用 CSS 样式表手动配置 slider ,并创建了一个类似于 slider 的按钮来表示上次保存的值。现在类看起来像这样。
滚动条.h
#ifndef SCROLLBAR_H
#define SCROLLBAR_H
#include <QSlider>
#include <QPaintEvent>
#include <QPushButton>
class ScrollBar : public QSlider
{
Q_OBJECT
public:
ScrollBar ( QWidget * parent = 0 );
~ScrollBar();
void init();
void update();
protected:
QPushButton* button;
protected slots:
void mousePressEvent();
};
#endif // SCROLLBAR_H
滚动条.cpp
#include "scrollbar.h"
#include <QPainter>
ScrollBar::ScrollBar( QWidget * parent ) :
QSlider (Qt::Horizontal, parent) {
QSlider::setMaximum(100);
QSlider::setMinimum(0);
QSlider::setValue(50);
QSlider::setFixedSize(200, 20);
button = new QPushButton(this);
button->setObjectName("slider");
button->move(0, 3);
button->setEnabled(true);
button->setFocusPolicy(Qt::NoFocus);
connect(button, SIGNAL(pressed()), this, SLOT(mousePressEvent()));
}
void ScrollBar::update() {
std::cout << "Called update()" << std::endl;
// The following moves the false button
double delta = QSlider::sliderPosition() /
(double) (QSlider::maximum() - QSlider::minimum()) *
(QSlider::width() - 14);
button->move(delta, 3);
}
void ScrollBar::mousePressEvent() {
QPoint pos = button->pos();
pos.setX( pos.x() + 7 );
pos.setY(6);
QMouseEvent evt(QEvent::MouseButtonPress, pos, Qt::LeftButton,
Qt::LeftButton, Qt::NoModifier);
QSlider::mousePressEvent(&evt);
}
ScrollBar::~ScrollBar() {
}
slider .css
QSlider::groove:horizontal {
border: 1px solid #bbb;
background: white;
height: 10px;
border-radius: 4px;
}
QSlider::sub-page:horizontal {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #66e, stop: 1 #bbf);
background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,
stop: 0 #bbf, stop: 1 #55f);
border: 1px solid #777;
height: 10px;
border-radius: 4px;
}
QSlider::add-page:horizontal {
background: #fff;
border: 1px solid #777;
height: 10px;
border-radius: 4px;
}
QSlider::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 #eee, stop:1 #ccc);
border: 1px solid #777;
width: 13px;
margin-top: -2px;
margin-bottom: -2px;
border-radius: 4px;
}
QSlider::handle:horizontal:hover {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 #fff, stop:1 #ddd);
border: 1px solid #444;
border-radius: 4px;
}
QSlider::sub-page:horizontal:disabled {
background: #bbb;
border-color: #999;
}
QSlider::add-page:horizontal:disabled {
background: #eee;
border-color: #999;
}
QSlider::handle:horizontal:disabled {
background: #eee;
border: 1px solid #aaa;
border-radius: 4px;
}
QPushButton#slider {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 #ccc, stop:1 #aaa);
border: 1px solid #777;
max-width: 13px;
min-width: 13px;
max-height: 12px;
min-height: 12px;
border-radius: 4px;
}
添加小部件看起来像这样:
QFile file("slider.css");
file.open(QFile::ReadOnly);
QString style = file.readAll();
file.close();
ScrollBar* scroll = new ScrollBar(parent);
parent->setStyleSheet(style);
// or scroll->setStyleSheet(style); if the style should be added only to this widget
.结果如下所示:
我必须连接按下按钮以将鼠标事件传递给 slider ,因为按钮位于 slider 之上。
编辑
一个更简洁的解决方案是添加透明滚动条而不是按钮。
滚动条.h
#ifndef SCROLLBAR_H
#define SCROLLBAR_H
#include <QSlider>
#include <QResizeEvent>
class ScrollBar : public QSlider
{
Q_OBJECT
public:
bool enabled;
ScrollBar ( QWidget * parent = 0 );
~ScrollBar();
void init();
void update();
void setValue(int);
void setFixedValue(int);
QSize sizeHint() const;
protected:
QSlider* slider_fixed;
QSlider* slider_top;
virtual void resizeEvent(QResizeEvent *evt);
};
#endif
滚动条.cpp
#include "scrollbar.h"
#include <QFile>
ScrollBar::ScrollBar( QWidget * parent ) : QSlider (Qt::Horizontal, parent) {
QSlider::setMaximum(100);
QSlider::setMinimum(0);
QSlider::setValue(50);
slider_fixed = new QSlider(Qt::Horizontal, this);
slider_fixed->setMaximum( QSlider::maximum() );
slider_fixed->setMinimum( QSlider::minimum() );
slider_fixed->setValue( QSlider::minimum() );
slider_fixed->setObjectName("transparent_fixed");
slider_top = new QSlider(Qt::Horizontal, this);
slider_top->setMaximum( QSlider::maximum() );
slider_top->setMinimum( QSlider::minimum() );
slider_top->setValue( QSlider::sliderPosition() );
slider_top->setObjectName("transparent_top");
QFile file("slider.css");
file.open(QFile::ReadOnly);
QString style = file.readAll();
file.close();
QSlider::setStyleSheet(style);
QObject::connect(slider_top, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
}
QSize ScrollBar::sizeHint() const {
return QSize(2000, 20);
}
void ScrollBar::resizeEvent(QResizeEvent *evt) {
int width = evt->size().width();
int height = evt->size().height();
slider_fixed->resize(width, height);
slider_top->resize(width, height);
}
void ScrollBar::setFixedValue(int value) {
slider_fixed->setValue( value );
}
void ScrollBar::setValue(int value) {
slider_top->setValue(value);
}
ScrollBar::~ScrollBar() {
}
slider .css
QSlider::groove:horizontal {
border: 1px solid #bbb;
background: white;
height: 10px;
border-radius: 4px;
}
QSlider::sub-page:horizontal {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #66e, stop: 1 #bbf);
background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,
stop: 0 #bbf, stop: 1 #55f);
border: 1px solid #777;
height: 10px;
border-radius: 4px;
}
QSlider::add-page:horizontal {
background: #fff;
border: 1px solid #777;
height: 10px;
border-radius: 4px;
}
QSlider::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 #eee, stop:1 #ccc);
border: 1px solid #777;
width: 13px;
margin-top: -2px;
margin-bottom: -2px;
border-radius: 4px;
}
QSlider::handle:horizontal:hover {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 #fff, stop:1 #ddd);
border: 1px solid #444;
border-radius: 4px;
}
QSlider#transparent_fixed::groove:horizontal {
border: none;
background: transparent;
border-radius: 0px;
}
QSlider#transparent_fixed::sub-page:horizontal {
background: transparent;
border: none;
border-radius: 0px;
}
QSlider#transparent_fixed::add-page:horizontal {
background: transparent;
border: none;
border-radius: 0px;
}
QSlider#transparent_fixed::handle:horizontal {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 #bbb, stop:1 #999);
}
QSlider#transparent_fixed::handle:horizontal:hover {
border: 1px solid #777;
}
QSlider#transparent_top::groove:horizontal {
border: none;
background: transparent;
border-radius: 0px;
}
QSlider#transparent_top::sub-page:horizontal {
background: transparent;
border: none;
border-radius: 0px;
}
QSlider#transparent_top::add-page:horizontal {
background: transparent;
border: none;
border-radius: 0px;
}
关于c++ - Qt:创建一个滚动条,后面有一个阴影,它包含最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24636135/
如果附加了 'not-scroll' 类,我希望我的 body 不滚动,否则它应该正常工作。 我已经搜索这个问题两天了,但找不到任何适合我的解决方案。 我想要的是向 body 添加一个 class,并
我发现似乎是 iOS Safari 中的错误(我正在 iOS 8 上进行测试)。当绝对定位的 iFrame 漂浮在一段可滚动内容上方时,滚动 iFrame 也会滚动下面的内容。以下 HTML (ava
我有以下代码来显示一系列投资组合图片,这些图片以 SVG 格式存储在滚动 div 中: 在 Safari 中滚动使用两根手指或鼠标滚轮当光标位于 SVG 之一上时不起作用。 该页
我想用 javascript 做的是: 一旦你向下滚动页面,将#sidebar-box-fixed 的位置从 position: relative; 更改为定位:固定;。改回position:rela
我对 Elasticsearch 的滚动功能有点困惑。在 elasticsearch 中,每当用户在结果集上滚动时,是否可以每次调用搜索 API?来自文档 "search_type" => "scan
我试图做到这一点,以便当我向上或向下滚动页面时,它会运行不同的相应功能。我发现了一个类似的问题here但我已经尝试了他们的答案并且没有运气。 注意:此页面没有正常显示的滚动条。没有地方可以滚动。 bo
(C语言,GTK库) 在我的表单上,我有一个 GtkDrawingArea 小部件,我在上面使用 Cairo 绘制 GdkPixbufs(从文件加载)。我想要完成的是能够在窗口大小保持固定的情况下使用
最近我一直在尝试创建一个拉到(刷新,加载更多)swiftUI ScrollView !!,灵感来自 https://cocoapods.org/pods/SwiftPullToRefresh 我正在努
我正在开发一个应用程序,其中有两个带有可放置区域的列表和一个带有可拖动项目的侧面菜单。 当我滚动屏幕时,项目的位置困惑。 我试图在谷歌上寻找一些东西,最后得到了这个问题:jQuery draggabl
我在 UIWebView 中加载了一个 HTML 表单,而我的 UIWebView 恰好从 View 的中间开始并扩展。我必须锁定此 webView 不滚动并将其放在 ScrollView 之上以允许
如何在每个元素而不是整个元素上应用淡入淡出(与其高度相比)? HTML: CSS: * { padding: 0; margin: 0; box-sizing: border
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
我制作这个程序是为了好玩,但我被卡住了,因为程序在屏幕外运行。如何在不完全更改代码的情况下实现滚动条。 public static void main(String args[]) throws IO
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
使用 jquery 技术从 css-tricks.com 获得滚动/跟随侧边栏,如果您不知道我在说什么,这里是代码: $(function() { var $sidebar = $
我是 jQuery Mobile 新手。我需要向我的应用程序添加 Facebook 滑动面板功能。 我经历了 sliding menu panel ,它工作正常,但我在菜单面板中的内容超出了窗口大小,
有没有办法在 js 或 jQuery 或任何其他工具中检测 ctrl + 滚动。我正在尝试执行一些动态布局代码,我需要检测不同分辨率下的屏幕宽度,我通过使用 setTimeout() 的计时器实现了这
我有一部分html代码:
我想控制 RichTextBox 滚动,但在控件中找不到任何方法来执行此操作。 这样做的原因是我希望当鼠标光标位于 RichTextBox 控件上时鼠标滚轮滚动有效(它没有事件焦点:鼠标滚轮事件由表单
我是一名优秀的程序员,十分优秀!