旋转QLabel并保留其功能/样式表

Rotate QLabel and keep its functionality/stylesheet

本文关键字:样式 功能 QLabel 保留 旋转      更新时间:2023-10-16

现在我正在寻找一种合适的方法来旋转QLabel -最重要的是保持其功能和样式表。

我在这里发现了一个非常有趣的方法:垂直QLabel,还是等效的?

首先我很满意,因为它有效地旋转了标签。不幸的是,我添加的样式表(使用更大的字体和其他颜色)完全丢失了,对齐也消失了(myLabel_->setAlignment(Qt::AlignTop);没有效果)。

我读过QPainter::drawStaticText会提供更多的功能,但对我来说,它根本不起作用(我使用与前面提到的解决方案相同的代码,只是不同之处:

QStaticText qs = "Test1";
painter.drawStaticText(0,0,qs);

)

使用弃用的HTML (" <b>...</b> ")代替样式表也没有用…与返回到常规的QLabel和使用现代转换样式表相同(http://snook.ca/archives/html_and_css/css-text-rotation)。

我现在已经想不出如何能够保持QLabel的先前属性并且仍然能够旋转它了

要做到这一点并不容易。

QStylePainter可能对样式有帮助:

#include<QStylePainter>
// ......
void LabelWidget::paintEvent(QPaintEvent* event) {
    QStylePainter painter(this);
    painter.rotate(90);
    painter.drawText(0, 0, text());
}

这将绘制具有样式表定义的属性的文本,但这并不能解决对齐问题。


如果您的drawStaticText代码使用rotate(90)并且不显示任何东西,这是因为文本围绕左上角点旋转,rotate(90)将把文本移出小部件(尝试rotate(45),您会发现部分文本移出小部件)。一个简单的解决方案是使用QPainter::translate移动到中心。

下面是我支持对齐的代码:
#include<QStylePainter>
// ......
void LabelWidget::paintEvent(QPaintEvent* event) {
    QStylePainter painter(this);
    // rotate at center
    painter.translate(rect().center());
    painter.rotate(90);
    painter.translate(-rect().center());
    painter.drawText(rect(), alignment(), text());
}

支持更多的特性,如换行:

#include<QStylePainter>
#include<QTextOption>
// ......
void LabelWidget::paintEvent(QPaintEvent* event) {
    QStylePainter painter(this);
    // rotate at center
    painter.translate(rect().center());
    painter.rotate(90);
    painter.translate(-rect().center());
    QTextOption textOption;
    textOption.setAlignment(alignment());
    if (wordWrap()) {
        textOption.setWrapMode(QTextOption::WordWrap);
    } else {
        textOption.setWrapMode(QTextOption::NoWrap);
    }
    painter.drawText(rect(), text(), textOption);
}

如果你想要QLabel的其他属性,你必须添加更多的功能,没有简单的解决方案。

PS:如果你想使用QStaticText,让它成为一个成员变量。

QStaticText类允许优化绘制文本时的文本而且它的布局很少更新。

QStaticText提供了一种缓存文本块布局数据的方法它可以比用QPainter::drawText()重新计算布局信息

你可以使用QGraphicsScene它可以显示任何自定义大小和方向的副本:

QLabel* myLabel_= QLabel("vertical label"); 
QGraphicsScene scene;
QGraphicsProxyWidget  * proxy = scene.addWidget(label);
proxy->rotate(90);
QGraphicsView view(&scene);
view.show();  

则可以将view替换为旧的myLabel_ object