Wie ändere ich die Textausrichtung in qtabwidget in C ++?
-
22-10-2019 - |
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:
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):
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());
}
};