Frage

Dies ist die gleiche Frage wie in:Wie ändere ich die Textausrichtung in qtabwidget?

Ich habe versucht, diesen Python -Code in C ++ zu portieren, aber er scheint nicht zu funktionieren.

Hier ist die Header -Datei:

#include <QTabBar>

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

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

Hier ist Quelldatei:

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);
}

Ich benutze es, indem ich die Newtabwidget -Klasse erstelle, die QTabwidget erbt. Im Konstruktor von Newtabwidget verwende ich:

setTabBar(new HorizontalTabWidget);

Dies geschieht nur, um dieses TabWidget verwenden zu können, da die Settabbar geschützt ist. Hier ist was ich bekomme:enter image description here

Was vermisse ich?

Bearbeiten:Was ich erstellen möchte, ist dies, aber mit Symbolen oben und den Beschriftungen unter den Symbolen (wie im QT -Schöpfer):enter image description here

War es hilfreich?

Lösung

Das Problem sollte in der Lackmethode sein; Überprüfen Sie, ob ein Beispiel unten für Sie funktionieren würde. Es sollte Registerkarten genauso zeichnen wie qtcreator. Ich habe den Original -Tab -Stil wiederverwendet QStyleOptionTabv3 Um die Mehrheit der Lackierung zu erledigen und dann nur das Symbol und den Registerkarte Text über dem Bild zu machen, das es erstellt hat:

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);

Das hat in meinem Ubuntu gut funktioniert, hoffe es wird für Sie, Grüße

Andere Tipps

Vasiliy, danke, dass du den Doppel -Qpainter -Fehler behoben hast.

Das Anrufen von Settabicon () und settabtext () von mastabvent () führt jedoch zu einer unendlichen Rekursion. Denken Sie daran, dass Registerkarte ein lokales Objekt ist, also

tab.text = QString();

wirkt sich nicht auf Tabtext () aus.

Das Beispiel kann also auch geschrieben werden, ohne vorübergehende Kopien zu erstellen und zu tun

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

Dieses Beispiel funktioniert nicht. führt zu einem Herbstprogramm.

Bringen Sie Ihr eigenes Beispiel mit kleinen Änderungen mit - mein System QT 4.6.3 für Windows und 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());
    }
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top