首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >旋转QLabel并保留其功能/样式表

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

Stack Overflow用户
提问于 2014-07-10 23:20:44
回答 2查看 4K关注 0票数 0

一段时间以来,我一直在寻找一种适当的方法来旋转一个QLabel --最重要的是保持它的功能和样式表。

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

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

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

代码语言:javascript
运行
复制
QStaticText qs = "Test1";
painter.drawStaticText(0,0,qs);

)

使用废弃的HTML ("<b>...</b>")代替样式表也是没用的.与返回常规QLabel和使用现代转换样式表(css/css-文本-旋转)相同。

现在我的想法已经不多了,我可以保留QLabel以前的属性,并且仍然能够旋转它……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-12 06:27:04

要做到这一点是不容易的。

QStylePainter可能会在样式方面有所帮助:

代码语言:javascript
运行
复制
#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::移动到中心。

下面是支持对齐的代码:

代码语言:javascript
运行
复制
#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());
}

要支持更多的功能,如字包装:

代码语言:javascript
运行
复制
#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()更有效地绘制布局数据,在QPainter::drawText()中,布局信息将与每个调用重新计算。

票数 2
EN

Stack Overflow用户

发布于 2022-05-28 09:05:09

您可以使用QGraphicsScene,它可以显示任何具有自定义大小和方向的东西的副本:

代码语言:javascript
运行
复制
QLabel* myLabel_= QLabel("vertical label"); 
QGraphicsScene scene;
QGraphicsProxyWidget  * proxy = scene.addWidget(label);
proxy->rotate(90);
QGraphicsView view(&scene);
view.show();  

然后可以将view替换为旧的myLabel_对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24687856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档