【问题标题】:Rotate QLabel and keep its functionality/stylesheet旋转 QLabel 并保留其功能/样式表
【发布时间】:2014-07-10 23:20:44
【问题描述】:

现在我正在寻找一种合适的方法来旋转 QLabel - 最重要的是保持其功能和样式表。

我在这里找到了一个非常有趣的方法:Vertical QLabel, or the equivalent?

首先我很满意,因为它有效地旋转了标签。不幸的是,我添加的样式表(使用更大的字体和其他颜色)完全丢失了,对齐也消失了(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 以前的属性并且仍然能够旋转它......

【问题讨论】:

    标签: c++ qt rotation qt4


    【解决方案1】:

    要做到这一点并不容易。

    QStylePainter 可能有助于风格:

    #include<QStylePainter>
    // ......
    void LabelWidget::paintEvent(QPaintEvent* event) {
        QStylePainter painter(this);
        painter.rotate(90);
        painter.drawText(0, 0, text());
    }
    

    这将使用样式表定义的属性绘制文本,但这并不能解决对齐问题。


    如果您的drawStaticText 代码使用rotate(90) 并且没有显示任何内容,这是因为文本围绕左上角旋转,rotate(90) 会将文本移出小部件(尝试@987654327 @,您会发现部分文本超出了小部件)。一个简单的解决方案是使用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() 在其中重新计算布局信息 每次通话。

    【讨论】:

    • 感谢您的解决方案!带有样式表的部分对我来说非常有用。不幸的是,我仍然无法设置对齐方式(而且我不明白为什么要使用 QStaticText - 以及在哪里使用)。使用您的代码时,我的标签完全消失了。然而我可以用另一个想法来解决这个问题。我刚刚将我的标签移动到 QGridLayout 中。而不是使用myLabel_-&gt;setAlignment(Qt::AlignBottom);,我使用mainLayout_-&gt;addWidget(myLabel_, 1, 0, Qt::AlignBottom); - mainLayout_ 是一个QGridLayout。解决了我的问题。
    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2019-01-14
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多