Как изменить выравнивание текста в QTabWidget в C ++? - PullRequest
3 голосов
/ 26 января 2011

Это тот же вопрос, что и в: Как изменить выравнивание текста в QTabWidget?

Я пытался перенести этот код на 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);
}

Я использую его, создавая класс NewTabWidget, который наследует QTabWidget. В конструкторе NewTabWidget я использую:

setTabBar(new HorizontalTabWidget);

Это сделано только для того, чтобы можно было использовать этот tabWidget, потому что setTabBar защищен. Вот что я получаю: enter image description here

Что мне не хватает?

Edit: Я хочу создать это, но с иконками сверху и надписями под иконками (как в Qt Creator): enter image description here

Ответы [ 3 ]

2 голосов
/ 27 января 2011

проблема должна быть в методе рисования;проверьте, будет ли работать приведенный ниже пример, он должен рисовать вкладки так же, как 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());
    }
};

tabwidget init:

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, надеюсь, оно сработает для вас, с уважением

1 голос
/ 28 февраля 2011

Василий, спасибо за исправление двойной ошибки QPainter.

Однако вызов setTabIcon () и setTabText () из paintEvent () приводит к бесконечной рекурсии. Помните, что вкладка является локальным объектом, поэтому

tab.text = QString();

не влияет на tabText ().

Итак, пример также можно написать без создания временных копий и выполнить

p.drawText(tabrect, Qt::AlignBottom | Qt::AlignHCenter, tabText(index));
tabIcon(index).paint(&p, tabrect, Qt::AlignTop | Qt::AlignHCenter);
0 голосов
/ 05 февраля 2011

Этот пример не работает.приводит к падению программы.

приведите собственный пример с незначительными правками - моя система qt 4.6.3 для 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());
    }
};
...