2010-03-05 14 views
1

Je veux inclure une icône "supprimer" sur les entrées de mon QComboBox, mais j'ai du mal à attraper l'événement de presse de la souris. J'ai essayé de l'attraper sur la combobox, et j'ai essayé de réimplémenter la classe QIcon pour y attraper le mousepress. Pas de dé. Est-ce que quelqu'un sait comment faire cela?QIcon inside combobox

-D

+0

Où voulez-vous avoir l'icône? Toujours à côté du texte, alors jetez un oeil à: http://doc.trolltech.com/4.6/qcombobox.html#addItem-2 ou seulement lorsque vous déplacez la souris sur l'élément? –

+0

Combien d'utilisateurs s'attendent à ce que l'élément soit supprimé lorsque vous cliquez sur l'icône dans une liste déroulante? Je voudrais créer un bouton de suppression distinct en plus de la liste déroulante, et d'abord laisser l'utilisateur sélectionner l'élément qu'il veut supprimer. –

+0

Pour Rupert - Je n'ai aucun problème pour obtenir l'icône ici. Je souhaite recevoir des événements de souris lorsqu'un utilisateur clique dessus. – Dutt

Répondre

0

J'ai écrit du code un peu comme ceci, où je voulais placer une vue arborescente dans une zone de liste déroulante et j'avais besoin de prendre une action lorsque la case à cocher de l'arbre était cliquée. Ce que j'ai fini par faire était d'installer un filtre d'événement sur la zone de liste déroulante pour intercepter les clics de souris, comprendre où le clic de souris se passait, puis prendre une action. Vous pouvez probablement faire le même genre de chose avec votre icône. Voici le code:

bool TreeComboBox::eventFilter(QObject* object, QEvent* event) 
{ 
    if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease) 
    { 
    QMouseEvent* m = static_cast<QMouseEvent*>(event); 
    QModelIndex index = view()->indexAt(m->pos()); 
    QRect vrect = view()->visualRect(index); 

    if(event->type() == QEvent::MouseButtonPress && 
     (model()->flags(index) & Qt::ItemIsUserCheckable) && 
     vrect.contains(m->pos())) 
    { 
// Your action here 
     ToggleItem(index); 
     UpdateSelectionString(); 
    } 
    if (view()->rect().contains(m->pos())) 
     skipNextHide = true; 
    } 
    return QComboBox::eventFilter(object, event); 
} 
0

Peut-être que vous pouvez ré-écrire et d'utiliser QComboBox::mousePressEvent(QMouseEvent *e)e.x() avec QComboBox::iconSize() pour trouver si l'événement a eu lieu sur l'icône.

Cela va provoquer une rupture si un style Qt décide de changer la position de l'étiquette et de l'icône dans les listes déroulantes. Je ne sais pas si c'est possible?

+0

Mais je suis d'accord avec le commentaire à une réponse précédente. Je ne pense pas que c'est une bonne solution pour supprimer des choses d'une zone de liste déroulante. Généralement, si quelque chose est difficile à faire, c'est parce que ce n'est pas commun à faire. Par conséquent, la solution sera incohérente par rapport à d'autres logiciels. Le résultat final est souvent une interface utilisateur étrangère et/ou maladroite et les utilisateurs deviennent confus et/ou malheureux. – Mathias