一段时间以来,我一直在寻找一种适当的方法来旋转一个QLabel --最重要的是保持它的功能和样式表。
我在这里发现了一个非常有趣的方法:垂直QLabel,还是等价物?
首先,我很满意,因为它有效地旋转了标签。不幸的是,我添加的样式表(使用更大的字体和其他颜色)完全丢失了,对齐也消失了(myLabel_->setAlignment(Qt::AlignTop);
没有效果)。
我读过QPainter::drawStaticText
会提供更多的功能,但对我来说,它根本不起作用(我使用的代码与前面提到的解决方案中的代码相同,只是不同之处:
QStaticText qs = "Test1";
painter.drawStaticText(0,0,qs);
)
使用废弃的HTML ("<b>...</b>
")代替样式表也是没用的.与返回常规QLabel和使用现代转换样式表(css/css-文本-旋转)相同。
现在我的想法已经不多了,我可以保留QLabel以前的属性,并且仍然能够旋转它……
发布于 2014-07-12 06:27:04
要做到这一点是不容易的。
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::移动到中心。
下面是支持对齐的代码:
#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()更有效地绘制布局数据,在QPainter::drawText()中,布局信息将与每个调用重新计算。
发布于 2022-05-28 09:05:09
您可以使用QGraphicsScene,它可以显示任何具有自定义大小和方向的东西的副本:
QLabel* myLabel_= QLabel("vertical label");
QGraphicsScene scene;
QGraphicsProxyWidget * proxy = scene.addWidget(label);
proxy->rotate(90);
QGraphicsView view(&scene);
view.show();
然后可以将view
替换为旧的myLabel_对象。
https://stackoverflow.com/questions/24687856
复制相似问题