2017-01-28 1 views
0

J'ai 4 QLabels dans 5 lignes et quand je passe sur n'importe quel QLabel, tous les QLabels dans cette rangée doivent changer la couleur d'arrière-plan.Changer la couleur d'arrière-plan de QLabel lorsque plané dans Qt

Je suis nouveau à Qt. J'ai recherché à ce sujet et j'ai trouvé que c'est possible si nous faisons une sous-classe de QLabel et utilisons des événements de souris. Quelqu'un peut-il expliquer comment faire cela?

+0

S'il vous plaît ne pas demander des explications sur la façon de faire une tâche générale, mais faire quelques efforts et com e retour si vous rencontrez des problèmes dans votre mise en œuvre. –

Répondre

0

Une possibilité: installer un filtre d'événement sur chaque instance QLable:

for(auto label : this->labels){ 
    label->installEventFilter(this); 
} 

outrepasser ensuite la fonction de filtre d'événements de ce. Vous pouvez maintenant prendre tout état de cause de tout QLabel et changer l'arrière-plan:

bool MyWidget::eventFilter(QObject *watched, QEvent *event){ 

    if(labels.contains((QLabel*)watched)){ 
     if(event->type() == QEvent::Enter){ 

      for(auto label: this->labels){ 
       label->setStyleSheet("background-color: red"); 
      } 
     }else if(event->type() == QEvent::Leave){ 

      for(auto label: this->labels){ 
       label->setStyleSheet(""); 
      } 
     } 
    } 

    return false; 
} 

je la souris entrent et sortent des événements. Si la souris survole une étiquette, l'arrière-plan de toutes les étiquettes devient rouge.

Si vous utilisez un QGridLayout

Installer le filtre d'événements pour tous les intances QLabel:

QList<QLabel*> labels; 
labels << this->findChildren<QLabel*>(); 

for(auto lable : labels){ 
    lable->installEventFilter(this); 
} 

maintenant déterminer la ligne de la source d'événement et changer l'arrière-plan de tous les widgets dans la colonne:

bool MyWidget::eventFilter(QObject *watched, QEvent *event){ 

    if(event->type() == QEvent::Enter || event->type() == QEvent::Leave){ 

     QLabel* label = static_cast<QLabel*>(watched); 

     int index = this->ui->gridLayout->indexOf(label); 

     // determine the row 
     int row, column, rowSpan, columnSpan; 
     this->ui->gridLayout->getItemPosition(index, &row, &column, &rowSpan, &columnSpan); 

     // for each elemet in row 
     for(column = 0 ; column < this->ui->gridLayout->columnCount() ; column++){ 

      QLayoutItem* item = this->ui->gridLayout->itemAtPosition(row, column); 
      if(item == nullptr) continue; 

      QLabel* lable = dynamic_cast<QLabel*>(item->widget()); 
      if(label == nullptr) continue; 

      lable->setStyleSheet(event->type() == QEvent::Enter ? "background-color: red" : ""); 
     } 

    } 

    return false; 
} 
+0

Ceci changera l'arrière-plan de tous les QLabels. Mais j'ai besoin de changer l'arrière-plan des Qlabels présents dans cette rangée en particulier. – Pramod

+0

Utilisez-vous un QGridLayout? –

+0

J'ai utilisé QVBoxLayouts et un QHBoxLayout – Pramod