5行に4つのQLabelがあり、QLabelにカーソルを置くと、その行のすべてのQLabelが背景色を変更する必要があります。Qtで覆われたQLabelの背景色を変更する
Qtが初めてです。私はそれについて調べて、QLabelのサブクラスを作成してMouse Eventsを使用することが可能であることを発見しました。誰もこれを行う方法を説明することはできますか?
5行に4つのQLabelがあり、QLabelにカーソルを置くと、その行のすべてのQLabelが背景色を変更する必要があります。Qtで覆われた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の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;
}
一般的な作業を行う方法については質問しないでください。あなたの実装に問題がある場合は、戻ってください。 –