清新美观的自定义QScrollBar的超简单实现方法

这是最终的效果:
在这里插入图片描述

只有一个文件,直接可以编译运行
说明一点::
需要隐藏scrollbar的边框来消除QWidget赋予它的自带的黑色填充

#include <QListView>
#include <QApplication>
#include <QHBoxLayout>
#include <QScrollBar>
#include <QPainter>
#include <QStringListModel>
class VScrollBar:public QScrollBar
{
public:
    VScrollBar(){}
protected:
    void paintEvent(QPaintEvent* e){
        qreal pos = this->value() * 1.0 / this->maximum();

        int x = width();
        const int w = x - 2;
        int y = height();
        QPainter p(this);
        p.setRenderHints(QPainter::Antialiasing );
        QPen pen;

        pen.setColor("black");
        p.setPen(pen);
        //draw a line
        p.drawRoundedRect(QRectF(x/2-1,20,2,y - 40),1,1); // draw a line

        int _y = (y-40-w) * pos;
        p.setBrush(QBrush("gray"));
        //draw a knob
        pen.setWidth(2);
        p.drawRoundedRect(QRectF((x-w)/2,_y+20,w,w),w,w);
    }
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    auto * w = new QWidget;
    //设置白色的背景
    w->setPalette(QPalette("","white","","","","",""));
    auto * list = new QListView;
    //隐藏丑陋的边框
    list->setStyleSheet("border:none;");
    list->setVerticalScrollBar(new VScrollBar);
    auto * m = new QStringListModel;
    m->setStringList(QColor::colorNames());
    list->setModel(m);
    auto * mainLayout = new QHBoxLayout;
    mainLayout->addWidget(list);
    w->setLayout(mainLayout);
    w->show();
    return a.exec();
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QTreeWidget继承自QTreeView,它们都是使用QAbstractItemView的垂直滚动条。如果你想要自定义垂直滚动条,可以使用以下步骤: 1. 创建一个自定义的QScrollBar的子类,实现paintEvent()和minimumSizeHint()方法自定义垂直滚动条的外观和大小。 2. 在QTreeView或QTreeWidget对象中设置自定义的QScrollBar对象,使用setVerticalScrollBar()方法来进行设置。此外,你还需要使用setVerticalScrollBarPolicy()方法来将垂直滚动条的显示策略设置为Qt::ScrollBarAlwaysOff,以便隐藏默认的垂直滚动条。 下面是一个简单的示例代码: ```c++ #include <QApplication> #include <QTreeView> #include <QScrollBar> class CustomScrollBar : public QScrollBar { public: CustomScrollBar(QWidget* parent = nullptr) : QScrollBar(parent) { setStyleSheet("QScrollBar:vertical {" "background-color: #F5F5F5;" "border: none;" "width: 10px;" "margin: 0px 0px 0px 0px;" "}" "QScrollBar::handle:vertical {" "background-color: #CFCFCF;" "min-height: 20px;" "}" "QScrollBar::add-line:vertical {" "height: 0px;" "subcontrol-position: bottom;" "subcontrol-origin: margin;" "}" "QScrollBar::sub-line:vertical {" "height: 0px;" "subcontrol-position: top;" "subcontrol-origin: margin;" "}"); } QSize minimumSizeHint() const override { return QSize(10, 0); } void paintEvent(QPaintEvent* event) override { Q_UNUSED(event); QPainter painter(this); painter.fillRect(rect(), QColor("#F5F5F5")); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QTreeWidget treeWidget; treeWidget.setHeaderLabel("Header"); treeWidget.setRootIsDecorated(false); treeWidget.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); CustomScrollBar* customScrollBar = new CustomScrollBar(&treeWidget); treeWidget.setVerticalScrollBar(customScrollBar); QTreeWidgetItem* item1 = new QTreeWidgetItem(&treeWidget); item1->setText(0, "Item 1"); QTreeWidgetItem* item2 = new QTreeWidgetItem(&treeWidget); item2->setText(0, "Item 2"); treeWidget.show(); return a.exec(); } ``` 在这个示例中,我们创建了一个CustomScrollBar类来自定义垂直滚动条的外观,然后将其设置为QTreeWidget对象的垂直滚动条。注意,我们还将垂直滚动条的显示策略设置为Qt::ScrollBarAlwaysOff,以便隐藏默认的垂直滚动条。 这样,你就可以通过自定义QScrollBar实现自定义垂直滚动条。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值