2014-07-10 3 views
0

잠시 동안 QLabel을 회전시키는 적절한 방법을 찾고 있습니다. 기능 및 스타일 시트를 유지하는 것이 가장 중요합니다.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의 전 속성을 유지 할 수 있어요 어떻게 거의 지금은 아이디어가 부족 해요 ...

답변

2

는 할 쉬운 방법은 없습니다.

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

이 스타일 시트에 의해 정의 된 특성을 가진 텍스트를 그릴 것입니다, 그러나 이것은 정렬 문제가 해결되지 않습니다

QStylePainter

는 스타일로 도움이 될 수 있습니다. 당신의 drawStaticText 코드를 사용 rotate(90)이 어떤 일을 표시하지 않는 경우 텍스트가 왼쪽 상단 점을 중심으로 회전하고 rotate(90)이 ( rotate(45)을 시도 위젯에서 텍스트를 이동합니다 beacuse


, 그것은, 당신은 것입니다 텍스트의 일부가 위젯 밖에 있음을 알 수 있음). 간단한 해결책은 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의 기타 속성을 원하는 경우 더 많은 기능을 추가해야합니다 , 간단한 해결책이 없습니다.

추신 : QStaticText을 사용하려면 멤버 변수로 지정하십시오.

QStaticText 클래스를 사용하면 텍스트 및 그 레이아웃이 거의 업데이트되지 않을 때 텍스트의 최적화 된 그리기가 가능합니다.

QStaticText 그것이 QPainter를 :: DrawText에 사용하여보다 더 효율적으로 인출 할 수 있도록 텍스트 그래서 의 블록에 대한 레이아웃 데이터를 캐싱하는 방법을 제공한다() 된 레이아웃 정보는 매 호출 을 계산한다.

+0

해 주셔서 감사합니다. 스타일 시트가있는 부분은 완벽하게 작동했습니다. 불행히도 여전히 정렬을 설정할 수 없습니다. (왜 QStaticText를 사용해야하는지 이해하지 못합니다.) 귀하의 코드를 사용하면서 Label이 완전히 사라졌습니다. 그러나 나는 다른 생각으로이 문제를 풀 수 있었다. 방금 Label을 QGridLayout으로 옮겼습니다. 그리고 myLabel _-> setAlignment (Qt :: AlignBottom); 대신'mainLayout _-> addWidget (myLabel_, 1, 0, Qt :: AlignBottom)을 사용했습니다; - mainLayout_은 QGridLayout입니다. 내 문제를 해결했다. – Qohelet

관련 문제