본문 바로가기
SWE/Qt

[Qt] PlaceholderText의 색상 변경 방법 - Qt4 & Qt5

by S나라라2 2021. 7. 31.
반응형

요즘따라 Qt4 와 Qt5의 버전 차이를 많이 느끼고 있다. 

내가 쓰는 많은 메소드들이 Qt5부터 지원되고 있어서 Qt4는 하드코딩 하는 경우가 발생한다...... ㅠㅠ

 

TextEdit의 PlaceholderText의 색상을 변경하는 것 또한 Qt4에서는 하드 코딩이 필요하다...


PlcaeholderText 색상 변경하는 방법

 

PlaceholderText란?

Qt 위젯 중에 텍스트 인풋 박스들이 있다. (QLineEdit, QTextEdit, QPlainTextEdit)

사용자가 글을 입력할 수 있는 텍스트박스라고 생각하면 된다.

 

PlaceholderText는 텍스트박스 위젯들의 속성 중 하나인데, 한글로 직역하면 자리표시자문구이다. 

해당 텍스트 박스에 무엇을 입력해야하는지 사용자에게 예시를 알려줄 때 자주 쓰인다.

보통 회원가입창이나 로그인창에서 자주 볼 수 있다.

placeholderText - 홍길동, 000000-000000

 

 

placeholderText 작성 방법

placeholderText를 기입하는 방법은 2가지가 있다. 

 

1. Qt creator 또는 Qt designer 이용

Qt creator의 위젯 속성 탭에서 placeholdertext가 있다. 여기에 원하는 텍스트를 기입하면 된다.

 

ui파일에서 확인한 placeholderText

2. xml로 작성

QTextEdit 트리에 아래와 같이 placeholdertext 속성을 추가해주면 된다.

번역을 원하면 notr="true"를 제거하고 작성하면 된다.

   <property name="placeholderText">
    <string notr="true">홍길동</string>
   </property>

 

 


 

plcaeholderText의 기본 색상은 회색이다.

 

plcaeholderText 색상 변경 방법  : Qt5 버전일 경우

QPalette::PlaceholderText

Qt 5.12 이후 버전부터는 QPalette의 색상 규칙으로 placeholderText가 추가되었다. 

따라서 위젯의 platte의 색상 규칙을 지정하면 placeholderText의 색상이 변경 가능하다.

 

#define setPlaceholderTextColor(widget) \
{ \
    QPalette palette = widget->palette(); \
    palette.setColor(QPalette::PlaceholderText, Qt::blue); \
    widget->setPalette(palette); \
} \

(메소드로 만들고 싶진 않고, 여러 개의 위젯을 지정해주고 싶어서 매크로 함수로 뺐다. 반복문을 써도 되고 다양한 방법이 있을 수 있다.) 

위젯의 팔레트를 구해온다. 

팔레트의 placeholderText 색상 규칙에 색상을 지정해주고,

다시 해당 위젯의 팔레트로 지정해준다.

 

plcaeholderText 파랑색 확인

 

plcaeholderText 색상 변경 방법  : Qt4 버전일 경우

 

Qt4 버전일 경우 QPalette에 placeholderText 속성이 없다.

따라서 stylesheet를 이용하여 하드 코딩을 해야한다.

텍스트 박스의 텍스트가 비어있는 경우는 파랑색(placeholderText의 색상), 텍스트 박스의 텍스트가 기입되는 순간 검정색(일반 text 색상)으로 지정해준다.

// QList<QLineEdit*> 에 넣어서 관리한다.
m_lineEditList.push_back(ui->lineEdit);
m_lineEditList.push_back(ui->lineEdit_2);

updateTextColor();

// lineEdit위젯에 텍스트가 입력되면 updateTextColor메소드를 호출해준다.
connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(updateTextColor()));
connect(ui->lineEdit_2, SIGNAL(textChanged(QString)), this, SLOT(updateTextColor()));
 
 
// 색상 지정 다시 해주는 메소드
void Widget::updateTextColor()
{
    foreach(QLineEdit* textEdit, m_lineEditList)
    {
    	// placeholderText는 파랑색, 기본 text는 검정색으로 지정해준다.
        QColor color = textEdit->text().isEmpty() ? Qt::blue : Qt::black;
        textEdit->setStyleSheet("color: "+color.name());
    }
}

 

여기서 키포인트는 textChanged 시그널이 발생할 때 색상을 변경해주는 것이다.

 

결과 확인

텍스트 입력 전 placehodelrText의 색상은 파랑색이고, 사용자가 입력을 하면 검정색으로 보인다.

 


이외에도 다양한 방법이 있다.

QLineEdit 위젯을 상속받아 customized QLineEdit 위젯을 직접 만들 것이라면 paintEvent에서 drawText하기 전 pen 색상을 지정해줄 수도 있다.

 

개인적으로 Qt 다음 버전에서는 QStylesheet의 속성으로 placeholdertext color가 추가되기를 바랄뿐이다..

색상이나 스타일 작업 모두 stylesheet에서만 처리하고 싶다 하하하하하,,,

html이나 다른 곳에는 속성으로 줄 수 있던데,,,

 

 

반응형