网上多是用StyleSheet来设置控件默认滚动条的样式,很久之前我也是这么做的。
但是这样做有个小问题,当滚动条显示时,会挤占控件viewport的空间。
一.效果
![](https://i-blog.csdnimg.cn/blog_migrate/51b7d4d65a33ab3614172b54830ef5a2.gif)
二.原理
使用自定义的QScrollBar替换控件默认QScrollBar,替换时,要保证自定义的滚动条和默认滚动条能够联动。
默认滚动条会响应鼠标滚轮,联动以后,自定义的滚动条也能响应滚动了,就像效果中展示的一样。
联动关键代码如下:
QScrollBar *m_vScrollBar;
connect(verticalScrollBar(), SIGNAL(valueChanged(int)), m_vScrollBar, SLOT(setValue(int)));
connect(m_vScrollBar, SIGNAL(valueChanged(int)), verticalScrollBar(), SLOT(setValue(int)));
三.代码实践
QHListWidget.h
#ifndef QHLISTWIDGET_H
#define QHLISTWIDGET_H
#include <QListWidget>
#include <QScrollBar>
#include <QResizeEvent>
class QHListWidget : public QListWidget
{
Q_OBJECT
public:
QHListWidget(QWidget *parent = 0);
~QHListWidget();
p