2017-01-28 4 views
0

5 행에 4 개의 QLabel이 있고 QLabel에 마우스를 올리면 해당 행의 모든 ​​QLabel이 배경색을 변경해야합니다.Qt에서 마우스를 가져 갔을 때 QLabel의 배경색을 변경하십시오.

Qt를 처음 사용합니다. QLabel의 하위 클래스를 만들고 마우스 이벤트를 사용하면 검색이 가능하다는 것을 알았습니다. 아무도 이것을하는 방법을 설명 할 수 있습니까?

+0

일반적인 작업을 수행하는 방법에 대해 설명하지 말고 구현시 문제가 발생하면 다시 확인하십시오. –

답변

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

내가 마우스 입력하고 이벤트를두고 사용합니다. 레이블 위에 마우스를 올려 놓으면 모든 레이블의 배경이 빨간색으로 바뀝니다.

모든 QLabel의 intances에 대한 이벤트 필터를 설치합니다 QGridLayout

를 사용하는 경우 :

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

그러면 모든 QLabel의 배경이 변경됩니다. 그러나 특정 행에있는 Qlabel의 배경을 변경해야합니다. – Pramod

+0

QGridLayout을 사용합니까? –

+0

QVBoxLayouts와 QHBoxLayout을 사용했습니다 – Pramod

관련 문제