2017-01-28 7 views
0

У меня есть 4 QLabels в 5 строках, и когда я наводил курсор на любой QLabel, все QLabels в этой строке должны менять цвет фона.Изменить цвет фона QLabel при зависании в Qt

Я новичок в Qt. Я искал об этом и обнаружил, что это возможно, если мы создадим подкласс QLabel и будем использовать Mouse Events. Может ли кто-нибудь объяснить, как это сделать?

+0

Пожалуйста, не запрашивайте объяснений, как выполнять общую задачу, но приложите некоторые усилия и выполните e назад, если вы столкнетесь с проблемами в своей реализации. –

ответ

0

Возможность: Установка фильтра событий на каждом QLable например:

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

Затем переопределить функцию фильтра событий этого. Теперь вы можете поймать любое событие из любого QLabel и изменить цвет фона:

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; 
} 

я использовал мышь входа и выхода события. Если мышь над любой меткой, фон всех ярлыков изменился на красный.

Если вы используете QGridLayout

Установить фильтр событий для всех intances QLabel:

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

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

Теперь определить строку исходного события и изменения фона всех виджетов в столбце:

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

Это изменит фон всех QLabels. Но мне нужно изменить фон Qlabels, присутствующий в этой конкретной строке. – Pramod

+0

Вы используете QGridLayout? –

+0

Я использовал QVBoxLayouts и QHBoxLayout – Pramod

Смежные вопросы