UI에는 항목이 변경되었지만 변경 사항이 아직 커밋되지 않은 경우 굵게 표시되는 오랜 관습이 있습니다. 이상하게도 지금까지 우리는 콤보 상자를 사용하지 않았지만 지금은 사용하고 있으며이 동작을 구현해야합니다. 따라서 닫힌 콤보 상자로 표시되는 텍스트를 프로그래밍 방식으로 굵게 (나중에 굵게 해제)해야합니다. 그러나 팝업에서 전체 항목 목록을 굵게 표시하고 싶지는 않습니다. 더 쉬운 경우 목록에서 선택한 항목을 굵게 표시 할 수 있습니다.
거의이 작업을 수행하는 많은 답변을 보았지만 일반적으로 버튼이 아닌 목록 항목을 수정하려고합니다. 나는 그들 대부분에 대해 변형을 시도했다. 불행히도 나는 내가 시도한 것에 대한 기록을 보관하지 않았습니다. 그만한 가치에 대해 내 코드는 현재 다음과 같습니다.
myCombo->setStyleSheet(
"QComboBox {font-weight: bold;} "
"QComboBox QAbstractItemView::item {font-weight: normal;}"
);
그러면 단추가 굵게 표시되지만 목록 항목도 표시됩니다. 를 사용 QAbstractItemView
하지 않고 에만 정상 가중치를 적용 ::item
할 때 :open
와 :closed
를 기반으로 다른 기술을 시도했을 때도 동일한 동작이 나타납니다 QComboBox
.
나는 Qt에 상당히 익숙하지 않다고 말할 것입니다. Fedora 26에서 Qt5를 사용하고 있지만 CentOS 7에 배포 할 예정입니다.
QComboBox에서 글꼴 스타일을 설정하면 뷰의 (IMHO는 안됨) 재정의되는 것 같습니다.
그러나 콤보 상자에 대한 뷰를 명시 적으로 설정하려고하면 다음과 같이됩니다.
view = new QListView();
myCombo->setView(view);
OP가 게시 한 스타일 시트가 갑자기 작동했습니다.
그건 그렇고, 새로운 뷰는 원본과 다릅니다 (예 : 흰색 배경 등). OP가 그것에 만족하지 않는 것 같습니다. 물론 스타일링을 계속할 수는 있지만 일관된 스타일로 바로 사용할 수있는 뷰를 선호합니다.
기본 QComboBox
보기 검사 :
QComboBox * combo = new QComboBox();
qDebug() << combo->view();
다음과 같이 외칩니다.
QComboBoxListView(0x2091880)
따라서 QComboBoxListView
문서에서 찾을 수없고 qcombobox_p.h에 정의 된 특정 클래스 가 있습니다. 실제로 포함 할 수있는 파일이 아닙니다. 그러나 적어도 viewOptions
재정의 된 메서드 에서 문제가 발생한 위치를 이해할 수 있습니다 .
QStyleOptionViewItem option = QListView::viewOptions();
option.showDecorationSelected = true;
if (combo)
option.font = combo->font(); // <--- here
return option;
이는 생성시 초기화 된에 combo
대한 개인 포인터입니다 QComboBox
.
QComboBoxListView(QComboBox *cmb = 0) : combo(cmb) {}
항상보기 옵션 글꼴을 자체적으로 재정의합니다.
QComboBoxListView
클래스 사본을 편집하고 이름을 변경해 보겠습니다 .
comboitemview.h
#ifndef COMBOITEMVIEW_H
#define COMBOITEMVIEW_H
#include <QListView>
#include <QComboBox>
class ComboItemView : public QListView
{
Q_OBJECT
QComboBox * _box;
public:
ComboItemView(QComboBox *box);
protected:
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
QStyleOptionViewItem viewOptions() const;
};
#endif // COMBOITEMVIEW_H
comboitemview.cpp
#include "comboitemview.h"
#include <QPaintEvent>
#include <QPainter>
ComboItemView::ComboItemView(QComboBox * box = 0) : _box(box){}
void ComboItemView::paintEvent(QPaintEvent *event)
{
if (_box)
{
QStyleOptionComboBox opt;
opt.initFrom(_box);
opt.editable = _box->isEditable();
if (_box->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, _box))
{
QStyleOptionMenuItem menuOpt;
menuOpt.initFrom(this);
menuOpt.palette = palette();
menuOpt.state = QStyle::State_None;
menuOpt.checkType = QStyleOptionMenuItem::NotCheckable;
menuOpt.menuRect = event->rect();
menuOpt.maxIconWidth = 0;
menuOpt.tabWidth = 0;
QPainter p(viewport());
_box->style()->drawControl(QStyle::CE_MenuEmptyArea, &menuOpt, &p, this);
}
}
QListView::paintEvent(event);
}
void ComboItemView::resizeEvent(QResizeEvent *event)
{
resizeContents(viewport()->width(), contentsSize().height());
QListView::resizeEvent(event);
}
QStyleOptionViewItem ComboItemView::viewOptions() const
{
QStyleOptionViewItem option = QListView::viewOptions();
option.showDecorationSelected = true;
return option;
}
마지막으로 뷰 글꼴 스타일을 지정하는 데 사용합니다.
myCombo->setView(new ComboItemView(myCombo));
myCombo->setStyleSheet(
"QComboBox {font-weight: bold;} "
"QComboBox QAbstractItemView {font-weight: normal;}"
);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다