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

时间:2014-07-10 23:20:44

标签: c++ qt rotation qt4

有一段时间我正在寻找一种适当的旋转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的前属性并且仍然能够旋转它......

1 个答案:

答案 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(),其中重新计算布局信息   每次通话。