본문 바로가기
SWE/Qt

[Qt] QLabel 에 테두리 그리는 방법 | QPushButton border 추가

by S나라라2 2020. 9. 10.
반응형

QLabel에 테두리 그리는 방법

 

 

1. QPixmap 을 사용한 방법

 

QLabel에 테두리를 그리려면, QPixmap 같은 곳에 테두리를 그리고, 라벨에 넣는다.

예를 들면 다음과 같다.

 

// main or other method
{
	QPixmap pixmap;

	QLabel* label = new QLabel(this);
	label->setPixmap(pixmap);
}

// protected
void paintEvent(QPaintEvent* e)
{
	QPainter painter(this);
    painter->drawRect(this->rect(), "#ff0000"); 
    // 첫 번째 파라미터 : 사각형 위치, 사이즈
    // 두 번째 파라미터 : 색상, 여기서는 빨간색
}

참고로 QPainter는 paintEvent에서 생성해야 한다.

 

이렇게 구현하는 것이 정석이다.

 


 

2. QPushbutton의 setStyleSheet 이용하는 방법

 

지금 내가 하는 작업은 QPushButton을 상속받아서, customized button을 만들고 있었다.

그리고 그 customized button내부는 qlayout과 qlabel로 이루어져 있다.

 

따라서 QPushbutton의 style에서 기본으로 제공하는 border를 이용해서도 그려볼 수 있다.

 

새로운 시도!

 

setStyleSheelt(QString("border-width: 1px, border-style: solid;"));

위와 같은 방법으로 그리면 엄청 작게 텍스트를 감싸는 테두리가 그려진다.

border-style은 outset, solid, dotted 다양하게 있으니까 qt 레퍼런스 참조해서 변경하면 된다.

 

근데 문제가 있다.

예를 들어, text는 작고 버튼의 크기는 클 때, 테두리가 text를 감싸는 정도의 아주 작게 그려지기만 한다.

 

아래 그림을 봤을 때, 파란색이 버튼이고 그 안에 텍스트가 담겨있다.

그러면 위의 코드로 border를 칠해주면 위젯(버튼)의 크기를 따르지않고, text만 감쌀정도의 사각형으로 테두리를 그려준다.

내가 원하는 건 두 번째 그림!

현재 테두리
원하는 모양의 테두리

 

두 번째 그림처럼 칠해주기 위해 나는 border의 size를 추가하였다.

setStyleSheet(QString("border-width: 1px; border-style: outset; min-width: %1; min-height: %2;") \
                        .arg(sizeHint().width()).arg(sizeHint().height()));

 

나는 sizeHint() 를 지금 reimplement해서 구현했기 때문에, 그걸 호출했지만

widget의 width, height를 호출해서 그려도 되지 않을까 싶다.

 

 

 


나는 QPixmap을 안쓰고 테두리를 넣고 싶어서 다른 여러 방법들을 시도해 봤다.

 

실패한 방법들

 

실패1. QPixmap 없이 QPainter 을 이용한 시도 

painter.setPen(QPen(borderColor,1));
painter.drawRect(0,0,width()-1,height()-1);
QPainterPath painterPath;
painterPath.addRect(0, 0, width(), height());
painter.fillPath(painterPath, borderColor);

이 방법들은 모두 QPixmap을 QLabel에 넣었을 때만 그려진다. text만 있는 QLabel에서는 그려지지 않는다.

 

 

실패2. QPixmap을 bitmask로 변경하여 setMask하는 방법

QPixmap pixmap;
QPainter borderPainter(&pixmap);
borderPainter.drawRect(0, 0, this->width()-1, this->height()-1);

this->setMask(pixmap.mask());

푸하 이거는 buildError난다....

반응형