2012-02-15 3 views

답변

2

잘못된 것을하고 있습니다. 위젯을 비활성화하면 회색으로 표시되며 사용자 마우스 클릭 및 키보드 입력을받지 못합니다.

+0

나는 위젯을 비활성화하지 않습니다. Qt :: ItemIsEnabled 플래그없이 항목 플래그를 설정하기 만하면됩니다. QTreeView 위젯은 mousePressEvent를 받지만 항목을 선택하지 않습니다. –

+1

설명서에 분명하게 명시되어 있습니다. Qt :: ItemIsEnabled 사용자가 항목과 상호 작용할 수 있습니다. 따라서이 기능을 사용하지 않도록 설정하면 사용자가 항목과 상호 작용할 수 없으며 선택하거나 편집 할 수 없습니다. – Dmitriy

+1

프로그래밍 방식의 선택에 도움이되는 ItemIsSelectable, unsetting도 있습니다. –

3

내가 이해 한 것으로부터 항목을 "사용 안 함"으로 설정하고 동시에 항목을 선택할 수있게하려고합니다. 모델을 위조하는 것이 상당히 쉽습니다.

if (role == Qt::BackgroundRole){ 
    return QVariant(QApplication::palette()->color(QPalette::Inactive, QPalette::Window); 
} 

이렇게하면 회색으로 표시된 항목이 칠해지며 선택할 수 있습니다.

0

방금 ​​비슷한 문제가있었습니다 (비활성화 된 항목을 복사해야합니다). 다음은 비활성화 된 항목에 올바른 스타일을 설정하는 솔루션입니다 (스타일 시트를 무시하지 않음).

모델에 대한 사용자 지정 항목 대리인을 만듭니다.

/// Returns false only if item needs to be rendered as disabled. 
bool isIndexEnabled(const QModelIndex &index) 
{ 
    // Implement this function. 
} 

class ItemDelegate : public QStyledItemDelegate { 
public: 
    explicit ItemDelegate(QObject *parent = nullptr) 
     : QStyledItemDelegate(parent) {} 

protected: 
    void initStyleOption(
     QStyleOptionItemView *option, const QModelIndex &index) const override 
    { 
     QStyledItemDelegate::initStyleOption(option, index); 
     if (!isIndexEnabled(index)) 
      option->state &= ~QStyle::State_Enabled; 
    } 
}; 

새 항목 대리인을 모델에 설정하십시오.

auto itemDelegate = new ItemDelegate(model) 
model->setItemDelegate(itemDelegate); 
관련 문제