有一段时间我正在寻找一种适当的旋转QLabel的方法 - 最重要的是保留其功能和样式表。
我在这里找到了一个非常有趣的方法:Vertical QLabel, or the equivalent?
首先,我很满意,因为它有效地旋转了标签。不幸的是,我添加的样式表(使用更大的字体和其他颜色)完全丢失,对齐也消失了(myLabel_->setAlignment(Qt::AlignTop);
没有效果)。
我已经阅读QPainter::drawStaticText
会提供更多功能,但对我来说它根本不起作用(我使用与之前提到的解决方案相同的代码,只需使用差异:
QStaticText qs = "Test1";
painter.drawStaticText(0,0,qs);
)
使用弃用的HTML(&#34; <b>...</b>
&#34;)而不是Stylesheets也没用...与返回常规QLabel并使用现代转换样式表(http://snook.ca/archives/html_and_css/css-text-rotation)相同
我现在几乎没有想法如何能够保留QLabel的前属性并且仍然能够旋转它......
答案 0 :(得分:2)
没有简单的方法可以做到这一点。
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(),其中重新计算布局信息 每次通话。