5 행에 4 개의 QLabel이 있고 QLabel에 마우스를 올리면 해당 행의 모든 QLabel이 배경색을 변경해야합니다.Qt에서 마우스를 가져 갔을 때 QLabel의 배경색을 변경하십시오.
Qt를 처음 사용합니다. QLabel의 하위 클래스를 만들고 마우스 이벤트를 사용하면 검색이 가능하다는 것을 알았습니다. 아무도 이것을하는 방법을 설명 할 수 있습니까?
5 행에 4 개의 QLabel이 있고 QLabel에 마우스를 올리면 해당 행의 모든 QLabel이 배경색을 변경해야합니다.Qt에서 마우스를 가져 갔을 때 QLabel의 배경색을 변경하십시오.
Qt를 처음 사용합니다. QLabel의 하위 클래스를 만들고 마우스 이벤트를 사용하면 검색이 가능하다는 것을 알았습니다. 아무도 이것을하는 방법을 설명 할 수 있습니까?
가능성 각 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;
}
일반적인 작업을 수행하는 방법에 대해 설명하지 말고 구현시 문제가 발생하면 다시 확인하십시오. –