QT通过QStyle自定义滚动条

在qt里面有默认的滚动区域可以方便使用,QScrollArea,这个自带了水平和垂直滚动条。

但是这些默认样式一般不是我们想要的,例如很多时候我们只需滚动块,而不需要其他的控件。

例如效果:

 

现在介绍自定义滚动条。

1.关闭默认滚动条显示

在使用QScrollArea时,垂直和水平滚动条全部不展示:

	area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

2.派生QScrollBar

class MyScrollBar :public QScrollBar
{
	Q_OBJECT
public:
	MyScrollBar(QWidget* parent = nullptr);
	~MyScrollBar();
	QSize sizeHint()const override;
	void setArea(QAbstractScrollArea * area);
protected:
	void paintEvent(QPaintEvent *ev) override;
	
private slots:
	void onSetRange(int min, int max);
private:
	QAbstractScrollArea* m_area = nullptr;
	MyScrollStyle* m_style = nullptr;
};

我们自定义的QScrollBar需要绑定原有的滚动条信号,这里我们只处理垂直滚动条:

void MyScrollBar::setArea(QAbstractScrollArea * area)
{
	area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
	area-
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以通过继承 QTabBar 类并重写 paintEvent() 函数来实现将滚动按钮改为滚动条的效果。具体实现步骤如下: 1. 在子类的构造函数中设置 QTabBar 的滚动模式为滚动条模式: ```cpp MyTabBar::MyTabBar(QWidget *parent) : QTabBar(parent) { setExpanding(false); setUsesScrollButtons(false); // 不使用滚动按钮 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); setTabScrollBehavior(QTabBar::ScrollPerPixel); // 每像素滚动 setScrollButtonsVisible(false); // 隐藏滚动按钮 } ``` 2. 重写 paintEvent() 函数,在函数中使用 QPainter 绘制滚动条,可以参考以下代码: ```cpp void MyTabBar::paintEvent(QPaintEvent *event) { QStylePainter painter(this); QStyleOptionTabBarBase opt; initStyleOption(&opt); // 绘制背景 painter.drawPrimitive(QStyle::PE_FrameTabBarBase, opt); // 绘制选项卡 for (int i = 0; i < count(); ++i) { QStyleOptionTab tab; initStyleOption(&tab, i); painter.drawControl(QStyle::CE_TabBarTabShape, tab); QRect textRect = tab.rect.adjusted(4, 0, -4, 0); painter.drawText(textRect, Qt::AlignCenter, tab.text); if (tab.state & QStyle::State_Selected) { painter.drawControl(QStyle::CE_TabBarTabLabel, tab); } } // 绘制滚动条 if (count() > 0) { QRect rect = tabRect(count() - 1); int totalWidth = rect.right() + 1; int visibleWidth = width(); if (totalWidth > visibleWidth) { int scrollPos = horizontalScrollBar()->value(); float ratio = static_cast<float>(scrollPos) / (totalWidth - visibleWidth); QRect scrollRect(width() - 16, 0, 16, height()); painter.fillRect(scrollRect, QColor(200, 200, 200)); int sliderWidth = qMax(16.0f, static_cast<float>(visibleWidth) / totalWidth * scrollRect.width()); int sliderPos = scrollRect.x() + ratio * (scrollRect.width() - sliderWidth); QRect sliderRect(sliderPos, scrollRect.y(), sliderWidth, scrollRect.height()); painter.fillRect(sliderRect, QColor(100, 100, 100)); } } } ``` 3. 在子类中实现滚动条的响应,可以使用 QScrollBar 的 valueChanged() 信号和 setHorizontalScrollBar() 函数来实现。例如: ```cpp MyTabBar::MyTabBar(QWidget *parent) : QTabBar(parent) { ... QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal, this); connect(scrollBar, &QScrollBar::valueChanged, this, &MyTabBar::tabScrollPosChanged); setHorizontalScrollBar(scrollBar); } void MyTabBar::tabScrollPosChanged(int value) { horizontalScrollBar()->setValue(value); } ``` 这样就可以将 QTabBar 的滚动按钮改成滚动条了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值