【问题标题】:How to change text alignment in QTabWidget in C++?如何在 C++ 中更改 QTabWidget 中的文本对齐方式?
【发布时间】:2011-06-15 16:23:31
【问题描述】:

这是同一个问题: How to change text alignment in QTabWidget?

我试图将该 python 代码移植到 C++ 中,但它似乎不起作用。

这是头文件:

#include <QTabBar>

class HorizontalTabWidget : public QTabBar
{
    Q_OBJECT
public:
    explicit HorizontalTabWidget(QWidget *parent = 0);

protected:
    void paintEvent(QPaintEvent *);
    QSize sizeHint() const;
};

这里是源文件:

void HorizontalTabWidget::paintEvent(QPaintEvent *)
{
    for(int index = 0; index < count(); index++)
    {
        QPainter * painter = new QPainter(this);
        painter->begin(this);
        painter->setPen(Qt::blue);
        painter->setFont(QFont("Arial", 10));
        QRect tabrect = tabRect(index);
        painter->drawText(tabrect, Qt::AlignVCenter | Qt::TextDontClip, tabText(index));
        painter->end();
    }
}

QSize HorizontalTabWidget::sizeHint() const
{
    return QSize(130, 130);
}

我通过创建继承 QTabWidget 的 NewTabWidget 类来使用它。在我使用的 NewTabWidget 的构造函数中:

setTabBar(new HorizontalTabWidget);

这样做只是为了能够使用该 tabWidget,因为 setTabBar 是受保护的。这是我得到的:

我错过了什么?

编辑: 我想要创建的是这个,但顶部有图标,图标下有标签(如在 Qt Creator 中):

【问题讨论】:

  • 您希望它是什么样子?你对 Qt::AlignVCenter 有什么期待?
  • 是关于“CustomerList”文本的吗?如果你想居中,你应该使用 AlignHCenter。如果选项卡的实际顺序是垂直的,我不会将此类称为“HoriontalTabWidget”。 (我认为这种通常被称为AcoordionTab)
  • 您可以在由图标定义的 QRect 上绘制文本,如stackoverflow.com/questions/4270229/… 中所述。如果您的最后一次编辑是您当前代码的实际结果,那么您可以添加painter->rotate(90) 作为最后一步。
  • 最后的编辑是我使用QTabWidget而不改变paintEvent()的截图。
  • 从您提到的那个问题中:“解决了!刚刚更改了 tabSizeHint 中的方法 sizeHint 并且效果很好:)”这是 Qt Creator 中使用的选项卡小部件的源代码:qt.gitorious.org/qt-creator/qt-creator/blobs/master/src/plugins/…@ 987654324@

标签: c++ qt qt4 qtabwidget


【解决方案1】:

问题应该出在paint方法上;检查下面的示例是否适合您,它应该像 QTCreator 一样绘制标签。我重用了原来的标签样式QStyleOptionTabV3 来完成大部分的绘画工作,然后在它生成的图像上渲染图标和标签的文本:

class TestTabBar : public QTabBar
{
public:
    explicit TestTabBar(QWidget* parent=0) : QTabBar(parent)
    {
        setIconSize(QSize(80, 80));
    }

protected:
    QSize tabSizeHint(int) const
    {
        return QSize(80, 80);
    }
    void paintEvent(QPaintEvent *)
    {
        QStylePainter p(this);
        for (int index = 0; index < count(); index++)
        {
            QStyleOptionTabV3 tab;
            initStyleOption(&tab, index);

            QIcon tempIcon = tab.icon;
            QString tempText = tab.text;
            tab.icon = QIcon();
            tab.text = QString();

            p.drawControl(QStyle::CE_TabBarTab, tab);

            QPainter painter;
            painter.begin(this);
            QRect tabrect = tabRect(index);
            tabrect.adjust(0, 8, 0, -8);
            painter.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tempText);
            tempIcon.paint(&painter, 0, tabrect.top(), tab.iconSize.width(), tab.iconSize.height(), Qt::AlignTop | Qt::AlignHCenter);    
            painter.end();
        }
    }
};

class TestTabWidget : public QTabWidget
{
public:
    explicit TestTabWidget(QWidget *parent = 0) : QTabWidget(parent)
    {
        setTabBar(new TestTabBar());
    }
};

标签小部件初始化:

TestTabWidget* test = new TestTabWidget(this);
test->setGeometry(20, 20, 300, 200);
test->addTab(new QWidget(), QIcon("icon0.png"), "test0");
test->addTab(new QWidget(), QIcon("icon1.png"), "test1");
test->setTabPosition(QTabWidget::West);

这在我的 ubuntu 上运行良好,希望它对你有用, 问候

【讨论】:

  • 要为所有选项卡绘制图标并将图标居中对齐,我使用了以下模块: tempIcon.paint(&painter, tabrect.left() + 4, tabrect.top() + (tabrect. height() / 2) - (tab.iconSize.height() / 2), tab.iconSize.width(), tab.iconSize.height());
【解决方案2】:

Vasiliy,感谢您修复双 QPainter 错误。

但是,从 paintEvent() 中调用 setTabIcon() 和 setTabText() 会导致无限递归。请记住,选项卡是一个本地对象,所以

tab.text = QString();

不影响 tabText()。

所以,这个例子也可以不做临时拷贝就写出来

p.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tabText(index));
tabIcon(index).paint(&p, tabrect, Qt::AlignTop | Qt::AlignHCenter);

【讨论】:

    【解决方案3】:

    这个例子不起作用。导致秋季计划。

    带来您自己的示例,稍作修改 - 我的系统 qt 4.6.3 for Windows 和 VS2008

    class TestTabBar : public QTabBar
    {
    public:
        explicit TestTabBar(QWidget* parent=0) : QTabBar(parent)
        {
            setIconSize(QSize(58, 68));
        }
    
    protected:
        QSize tabSizeHint(int) const
        {
            return QSize(58, 68);
        }
    
        void paintEvent(QPaintEvent *)
        {
            QStylePainter p(this);
    
            for (int index = 0; index < count(); index++)
            {
                QStyleOptionTabV3 tab;
                initStyleOption(&tab, index);
    
                QIcon tempIcon = tabIcon(index);
                QString tempText = this->tabText(index);
    
                QRect tabrect = tabRect(index);
    
                tab.icon = QIcon();
                tab.text = QString();
    
                p.drawControl(QStyle::CE_TabBarTab, tab);
                tabrect.adjust(0, 3, 0, -3);
    
                p.setPen(Qt::black);    
                p.setFont(QFont("Arial", 7));
    
                p.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tempText );
                tempIcon.paint(&p, tabrect, Qt::AlignTop | Qt::AlignHCenter);
    
                this->setTabIcon(index, tempIcon );
                this->setTabText( index, tempText);
            }
        }
    };
    
    class TestTabWidget : public QTabWidget
    {
    public:
        explicit TestTabWidget(QWidget *parent = 0) : QTabWidget(parent)
        {
            setTabBar(new TestTabBar());
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 2016-05-28
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2020-05-18
      相关资源
      最近更新 更多