TabWidget中tabBar文字从左向右显示

本文介绍如何在Qt中自定义TabBar的样式,通过创建一个继承自QProxyStyle的类并重载drawControl()函数,实现TabBar标签文字的正确显示及美观布局。

在Qt中,当我们使用tabWidget,有时会把tabPosition属性设置成东西朝向的。但这时,我们会发现tabBar中的文字朝向也变了,如下图所示:

而我们总是希望文字是正对着我们的,而不是翻转过后的样子。

 

这里,我们可以通过setStyle来设置widget的风格,而QTabBar是继承自widget的也可以通过同样的方式,设置风格。

setStyle函数的定义为void setStyle(QStyle *style),也就是说我们需要传一个QStyle类型的变量进去。

然后要说一个继承自QStyle的类:QProxyStyle

 

QProxyStyle

QProxyStyle类是一个简便的类,它简化了动态覆盖的QStyle元素。 
QProxyStyle封装了一个QStyle(通常是默认的系统风格),用于动态覆盖绘画或其他特定风格的行为。

(以上为Qt帮助中的说明)

 

接下来,我们需要写一个自定义的继承自QProxyStyle的类,然后作为参数传到setStyle里面。

在这个自定义类中,我们重载QProxyStyle中的函数drawControl()

 

[override virtual] void QProxyStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const

用提供的painter绘制给定的element,并使用选项指定的样式选项。

widget参数是可选的,可以用作绘制控件的帮助。 option参数是一个指向QStyleOption对象的指针,可以使用qstyleoption_cast()函数将其转换为正确的子类。

(以上为Qt帮助中的说明)

 

也就是说我们可以在drawControl中进行内容的绘图,可以改变TabBar的样式

 

代码如下(建一个继承于QProxyStyle的类):

class CustomTabStyle:public QProxyStyle
{
public:
    CustomTabStyle(){}


    QSize sizeFromContents(ContentsType type, const QStyleOption *option,
        const QSize &size, const QWidget *widget) const                   //设置Bar上面的内容大小
    {
        QSize s = QProxyStyle::sizeFromContents(type, option, size, widget);
        if (type == QStyle::CT_TabBarTab) {
            s.transpose();
            s.rwidth() = 100;                                     // 设置每个tabBar中item的大小
            s.rheight() = 50;
        }
        return s;
    }

    void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
    {
        if (element == CE_TabBarTabLabel) {
            if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
                QRect allRect = tab->rect;     //定义一个矩形区域

                if (tab->state & QStyle::State_Selected) {
                    painter->save();
                    painter->setPen(0x89cfff);
                    painter->setBrush(QBrush(0x89cfff));                //蓝色底
                    painter->drawRect(allRect.adjusted(6, 6, -6, -6));
                    painter->restore();
                }
                QTextOption option;
                option.setAlignment(Qt::AlignCenter);     //使文字位置居中
                if (tab->state & QStyle::State_Selected) { //设置文字颜色
                    painter->setPen(0xf8fcff);           //白色字
                }
                else {
                    painter->setPen(0x000001);           //黑色字
                }

                painter->drawText(allRect, tab->text, option);
                return;
            }
        }

        if (element == CE_TabBarTab) {
            QProxyStyle::drawControl(element, option, painter, widget);
        }
    }


};

 然后new一个CustomTabStyle给相应的tabBar:

ui->tabWidget->tabBar()->setStyle(new CustomTabStyle);

效果图:

 

 

转载请标明出处,原文地址:https://blog.youkuaiyun.com/come_from_pluto

### 如何在 Qt 的 `QTabWidget` 中的 `TabBar` 上显示图片 在 Qt 中,可以通过 `QTabWidget` 提供的方法来设置带有图标和文字的标签页。具体来说,可以使用 `addTab()` 或者 `insertTab()` 方法,并传递一个 `QIcon` 对象作为参数之一。 以下是实现此功能的一个完整示例: ```cpp #include <QApplication> #include <QTabWidget> #include <QWidget> #include <QVBoxLayout> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建主窗口部件 QWidget window; QVBoxLayout layout(&window); // 创建 QTabWidget 实例 QTabWidget tabWidget; // 添加第一个页面 QPushButton button1("Page 1"); QWidget page1; QVBoxLayout layout1(&page1); layout1.addWidget(&button1); tabWidget.addTab(&page1, QIcon(":icons/page1.png"), "First Page"); // 添加第二个页面 QPushButton button2("Page 2"); QWidget page2; QVBoxLayout layout2(&page2); layout2.addWidget(&button2); tabWidget.addTab(&page2, QIcon(":icons/page2.png"), "Second Page"); // 设置布局并将 QTabWidget 放入其中 layout.addWidget(&tabWidget); // 显示窗口 window.resize(400, 300); window.show(); return app.exec(); } ``` #### 关键点解析 - **`addTab()` 和 `insertTab()` 方法** 这两个方法都可以用来向 `QTabWidget` 中添加新的标签页。它们支持两种形式:一种只接受文本,另一种允许指定一个 `QIcon` 图标[^2]。 - **资源文件路径 (`":/path/to/resource")`** 使用冒号开头的路径表示加载的是嵌入到应用程序中的资源文件。确保已正确配置 `.qrc` 文件以便程序能够找到这些图像资源[^2]。 - **自定义样式 (可选)** 如果希望进一步美化界面,比如调整字体大小、颜色或者其他视觉效果,则可通过应用 CSS 风格表单(QSS)完成。例如下面这段代码展示了如何更改选定状态下的背景渐变以及边框线的颜色[^4]: ```css /* style-dark */ QTabWidget::pane { border: 1px solid #00BB9E; border-radius:5px; } QTabBar::tab { background: #D3D3D3; border:none; border-top-left-radius: 4px; border-top-right-radius: 4px; min-width: 80px; padding: 8px; color:#000000; } QTabBar::tab:selected, QTabBar::tab:hover { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #fafafa, stop: 1.0 #00BB9E); } QTabBar::tab:selected { border: 1px solid #00BB9E; } ``` 通过以上方式即可实现在 `QTabWidget` 的 `TabBar` 上展示图片的功能。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值