Analyse du principe de base de Qt QComboBox

Concernant la façon dont le noyau QComboBox est implémenté et comment il fonctionne, l'analyse est la suivante:

QComboBox est une fenêtre héritée de la réécriture de QWidget, et la zone 111 est implémentée avec QLineEdit. Le code source est le suivant:

QLineEdit * lineEdit () const ;

La zone 2 est faite avec un bouton d'outils similaire à celui que vous pouvez utiliser pour dérouler les événements et changer les icônes

 

L' événement de la zone 2 affichera une fenêtre ListView associée, le noyau du système affichera une qlistview similaire associée à la fenêtre, la qlistview associée utilise la structure model-view-delegate,

La vue de liste répond aux événements auxquels il est répondu et gère le traitement des données associé à la zone 111,2.

Ainsi, QComboBox peut être librement transformé en diverses formes, telles que des formes irrégulières telles que des rectangles arrondis, et son composant lineEdit peut également être remplacé. Du code source, on peut voir qu'il supprime le lineEdit par défaut d'origine, puis le remplace par un nouveau LineEdit Le code source est le suivant:

void QComboBox :: setLineEdit ( QLineEdit * modifier )

{

。。。

    if ( modifier == d -> lineEdit )

        retour ;

 

    edit -> setText ( currentText ());

    supprimer d -> lineEdit ;

 

d -> lineEdit = modifier ;

。。。

}

Son principe de listview associé est similaire, il peut donc être librement transformé et une transformation indépendante,

Cela peut être un bug

        auto aaa = new QListView ();

        m_pComboBox -> setView ( aaa );

        aaa- > setStyleSheet ( "QAbstractItemView :: item {height: 35px;}" ); De cette façon, la hauteur de l'élément peut être définie avec succès,

Mais cela ne fonctionnera pas, en fait, sa signification logique devrait être la même, tous sont de modifier la vue

m_pComboBox -> view () -> setStyleSheet ( "QAbstractItemView :: item {height: 35px;}" );

Si vous devez rendre l'interface utilisateur plus complexe et modifiable, vous pouvez réécrire une vue de liste, tant que l'effet de la vue de liste peut le faire, QComboBox peut le faire.

 

Comme la vue de liste associée à QComboBox doit être indépendante, vous pouvez dessiner librement l'effet souhaité, mais il existe toujours une certaine association. Lorsque vous définissez la fenêtre sur un rectangle arrondi, généralement selon l'idée orientée objet, la vue de liste correspondante doit être définie Il peut s'agir d'un rectangle arrondi, mais l'effet n'est pas particulièrement idéal, comme le code suivant:

        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 {

      rayon-frontière: 14px;

      couleur de fond: rgb (134,134,134);

      }

) " );

L'effet a atteint un rectangle arrondi, mais il y aura une ombre, mais le code a NoDropShadowWindowHint , et l'ombre       a été supprimée, donc cela semble un peu illogique ici. Si vous changez le code en m_pComboBox / * -> view () * / -> setStyleSheet ( R "(

       QAbstractItemView {

      rayon-frontière: 14px;

      couleur de fond: rgb (134,134,134);

      }

Il peut obtenir l'effet souhaité, il n'y aura pas d'ombre, car il a été supprimé, c'est logique.

Il est à peu près supposé que son implémentation sous-jacente peut être que lors de l'utilisation de la feuille de style de vue interne, la fonction de dessin exécutée par la couche inférieure n'est que sa liste correspondante, mais cette couche inférieure NoDropShadowWindowHint doit être liée à la classe parent QComboBox, donc elle Certaines actions de dessin ne prennent pas effet, car aucune action connexe n'est effectuée sur leur classe parente, de sorte que NoDropShadowWindowHint ne prendra pas effet, donc Qt a ses propres règles et routines, donc si vous devez dessiner dans QComboBox, ne l'utilisez pas La sous-fenêtre correspondante essentiellement encapsulée, si vous avez besoin de dessiner, essayez d'utiliser la classe QComboBox elle-même, il n'y aura pas de problèmes similaires.

 

 

 

Publié 85 articles originaux · loué 18 · 120 000 vues

Je suppose que tu aimes

Origine blog.csdn.net/a1317338022/article/details/105281272
conseillé
Classement