旋转QLabel并保留其功能/样式表
Rotate QLabel and keep its functionality/stylesheet
现在我正在寻找一种合适的方法来旋转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