qt QTabBar的滚动按钮 改为滚动条
时间: 2023-07-12 08:21:55 浏览: 90
可以通过继承 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 的滚动按钮改成滚动条了。
阅读全文