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난다....