2017-01-28 20 views
0

5行に4つのQLabelがあり、QLabelにカーソルを置くと、その行のすべてのQLabelが背景色を変更する必要があります。Qtで覆われたQLabelの背景色を変更する

Qtが初めてです。私はそれについて調べて、QLabelのサブクラスを作成してMouse Eventsを使用することが可能であることを発見しました。誰もこれを行う方法を説明することはできますか?

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

私はマウス出入りイベントを使用していました。ラベルの上にマウスを置くと、すべてのラベルの背景が赤に変わります。

あなたはQGridLayoutを使用している場合

すべてQLabelのintancesのイベントフィルタをインストールします。

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

これは、すべてのQラベルの背景を変更します。しかし、私はその特定の行に存在するQlabelsの背景を変更する必要があります。 – Pramod

+0

QGridLayoutを使用していますか? –

+0

私はQVBoxLayoutsとQHBoxLayoutを使用しました – Pramod

関連する問題