목록 항목이 아닌 QComboBox의 텍스트를 굵게 만드는 방법은 무엇입니까?

피트

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

UITableView 항목의 아카이브를 만드는 방법은 무엇입니까?

파이썬에서 이메일 본문의 텍스트를 "굵게" 만드는 방법은 무엇입니까?

사용자가 목록보기 항목을 클릭 한 후 Android의 모든 항목이 아닌 광고를 표시하는 방법은 무엇입니까?

버튼의 텍스트를 굵게 만드는 방법은 무엇입니까?

전체 드롭 다운 목록 (WPF)이 아닌 프레젠테이션 줄에서만 ComboBox에서 굵게 설정하는 방법은 무엇입니까?

0에서 "n"이 아닌 인덱스의 드롭 다운 목록에 항목을 삽입하는 방법은 무엇입니까?

텍스트 문서의 특정 제목 아래에 항목 목록을 만드는 방법은 무엇입니까? (Linux / Bash)

JList에서 하나의 항목을 굵게 만드는 방법은 무엇입니까?

"목록 목록"의 각 항목에 텍스트를 추가하는 방법은 무엇입니까?

값이 아닌 데이터 목록 HTML5의 텍스트 만 표시하는 방법은 무엇입니까?

문자열이 아닌 ** 숫자 **의 배열 목록을 만드는 방법은 무엇입니까?

QCombobox를 계층 적 항목에 대해 확장 가능하게 만드는 방법은 무엇입니까?

플렉스 기반 항목의 맨 아래에 텍스트를 정렬하는 방법은 무엇입니까?

두 목록에서 단일 항목이 아닌 항목을 제외하는 방법은 무엇입니까?

목록의 각 항목의 시작과 끝에 텍스트를 추가하는 방법은 무엇입니까?

목록 페이지의 그리드를 편집 가능하게 만드는 방법은 무엇입니까?

클릭 시 목록 항목의 내용 텍스트를 복사하는 방법은 무엇입니까?

목록 상자에서 선택한 항목의 텍스트를 얻는 방법은 무엇입니까?

전체 부모가 아닌 플렉스 항목 만 오버플로 만드는 방법은 무엇입니까?

셀의 일부 텍스트를 굵게 만드는 방법은 무엇입니까?

tomcat이 shared / lib 내부의 항아리가 아닌 maven 항아리를 보게 만드는 방법은 무엇입니까?

Bootstrap에서 오른쪽 / 왼쪽 아이콘 / 텍스트 목록을 만드는 방법은 무엇입니까?

프로그래밍 방식으로 iOS Objective C에서 텍스트 레이블의 일부를 굵게 만드는 방법은 무엇입니까?

javascript / jquery를 사용하여 괄호 사이의 텍스트를 굵게 만드는 방법은 무엇입니까?

목록의 항목에 대해 Java에서 여러 스레드를 만드는 방법은 무엇입니까?

제목은 굵게 표시되지만 제목이 아닌 제목은 apache poi hslf를 사용하는 ppt 텍스트 상자에서 굵게 표시되지 않아야합니다.

루프가 아닌 목록의 모든 숫자와 숫자를 비교하는 방법은 무엇입니까?

숫자가 아닌 목록의 각 요소를 as.numeric으로 변환하는 함수를 만드는 방법은 무엇입니까?

부트 스트랩 navbar의 드롭 다운 메뉴 항목을 수직이 아닌 수평으로 표시하는 방법은 무엇입니까?