Com relação a como o kernel QComboBox é implementado e como ele funciona, a análise é a seguinte:
QComboBox é uma janela herdada da reescrita do QWidget e a área 111 é implementada com o QLineEdit.O código-fonte é o seguinte:
QLineEdit * lineEdit () const ;
A zona 2 é criada com um botão de ferramenta semelhante ao que você pode usar para exibir eventos e alterar ícones
O evento da Zona 2 exibirá uma janela ListView associada, o kernel do sistema exibirá uma qlistview semelhante associada à janela, a qlistview associada usará a estrutura model-view-delegate
A listview responde aos eventos que são respondidos e manipula o processamento de dados associado à área 111,2.
Assim, o QComboBox pode ser transformado livremente em várias formas, como formas irregulares, como retângulos arredondados, e o componente lineEdit também pode ser substituído.No código-fonte, é possível ver que ele exclui o lineEdit padrão original e o substitui por um novo LineEdit O código fonte é o seguinte:
void QComboBox :: setLineEdit ( QLineEdit * edit )
{
。。。
if ( editar == d -> lineEdit )
retorno ;
edit -> setText ( currentText ());
excluir d -> lineEdit ;
d -> lineEdit = editar ;
。。。
}
Seu princípio de exibição de lista associado é semelhante, portanto pode ser transformado livremente e transformação independente,
Isso pode ser um bug
auto aaa = novo QListView ();
m_pComboBox -> setView ( aaa );
aaa- > setStyleSheet ( "QAbstractItemView :: item {height: 35px;}" ); dessa forma, a altura do item pode ser definida com êxito,
Mas isso não vai funcionar, na verdade, o seu significado lógico deve ser o mesmo, todos são para modificar a visão
m_pComboBox -> view () -> setStyleSheet ( "QAbstractItemView :: item {height: 35px;}" );
Se você precisar tornar a interface do usuário mais complexa e mutável, poderá reescrever uma exibição de lista, desde que o efeito que a exibição de lista possa causar, o QComboBox possa fazê-lo.
Como a exibição de lista associada ao QComboBox deve ser independente, você pode desenhar livremente o efeito desejado, mas ainda existe uma certa associação.Quando definir a janela para um retângulo arredondado, geralmente de acordo com a ideia orientada a objeto, a exibição de lista correspondente deve ser configurada Pode ser um retângulo arredondado, mas o efeito não é particularmente ideal, como o seguinte código:
m_pComboBox -> view () -> window () -> setWindowFlags ( Qt :: Popup | Qt :: FramelessWindowHint | Qt :: NoDropShadowWindowHint );
m_pComboBox -> view () -> window () -> setAttribute ( Qt :: WA_TranslucentBackground );
m_pComboBox -> view () -> setStyleSheet ( R "(
QAbstractItemView {
raio da borda: 14 px;
cor de fundo: rgb (134.134.134);
}
) " );
O efeito alcançou um retângulo arredondado, mas haverá uma sombra, mas o código possui NoDropShadowWindowHint e a sombra foi removida, por isso parece um pouco ilógico aqui.Se você alterar o código para m_pComboBox / * -> view () * / -> setStyleSheet ( R "(
QAbstractItemView {
raio da borda: 14 px;
cor de fundo: rgb (134.134.134);
}
Pode alcançar o efeito desejado, não haverá sombra, porque foi removido, é lógico.
Supõe-se, grosso modo, que sua implementação subjacente pode ser que, ao usar a folha de estilo da vista interna, a função de desenho executada pela camada inferior seja apenas sua exibição de lista correspondente, mas essa camada inferior NoDropShadowWindowHint esteja relacionada à classe pai QComboBox, portanto Algumas ações de desenho não entram em vigor, porque nenhuma ação relacionada é executada em sua classe pai; portanto, o NoDropShadowWindowHint não entrará em vigor, portanto, o Qt tem suas próprias regras e rotinas; portanto, se você precisar desenhar no QComboBox, não use-o A sub-janela basicamente encapsulada correspondente, se você precisar desenhar, tente usar a própria classe QComboBox, não haverá problemas semelhantes.