簡體   English   中英

將鼠標懸停在Qt中時更改QLabel的背景顏色

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM