gpt4 book ai didi

c++ - 有没有一种简单的方法可以在 QWidget 的子项上触发 hoverenter/hoverleave 事件?

转载 作者:行者123 更新时间:2023-11-28 04:47:06 26 4
gpt4 key购买 nike

出于样式目的,如果指针进入这些小部件中的任何一个,我试图使一组小部件中的所有小部件采用特定背景;即,如果指针位于小部件 A 的包含矩形内,则 A 和小部件 B 都应更改其背景。同样,如果指针进入B,那么A也应该采用相同的背景。如果指针同时位于 A 和 B 之外,背景自然会退回到非悬停背景。

QWidget 似乎拥有完成此操作的大部分管道,但它隐藏在 protected 之后。

如果可以避免的话,我真的很想避免从 QWidget 继承,而且我真的很想不必也更改小部件的样式表。

[1] 在我的例子中,我有三个小部件,而不是两个。

最佳答案

有一个event filter类,并让它在指针 vector 中保存受影响的小部件:

#include <QMouseEvent>

class EventFilter : public QObject
{
Q_OBJECT
QVector<QWidget*> widgets;

public:
void append(QWidget * w)
{
w->setAttribute(Qt::WA_Hover);
w->installEventFilter(this);
widgets.append(w);
}
bool eventFilter(QObject *watched, QEvent *event)
{
if(event->type() == QMouseEvent::HoverEnter)
{
for(auto w : widgets)
{
w->setStyleSheet("background-color: red;");
}
}
else if(event->type() == QMouseEvent::HoverLeave)
{
for(auto w : widgets)
{
w->setStyleSheet("background-color: white;");
}
}
return false;
}
};

append 方法将设置小部件并将其推送到 vector 中。

在你的表单类中有一个私有(private)过滤器实例:

class Form : public QWidget
{
Q_OBJECT

//...

private:
EventFilter filter;

//...

在您的表单构造函数中:

ui->setupUi(this);

filter.append(ui->widget1);
filter.append(ui->widget2);
filter.append(ui->widget3);

在示例中,我使用 setStyleSheet 设置背景颜色,但您可以使用您喜欢的任何策略,即重置小部件调色板。

关于c++ - 有没有一种简单的方法可以在 QWidget 的子项上触发 hoverenter/hoverleave 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49066464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com