[英]Change background color of QLabel when hovered in Qt
我在5行中有4个QLabel,当我将鼠标悬停在任何QLabel上时,该行中的所有QLabel都需要更改背景色。
我是Qt的新手。 我搜索了一下,发现如果我们做一个QLabel的子类并使用Mouse Events是可能的。 谁能解释如何做到这一点?
一种可能性:在每个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
为所有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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.