是否有一种简单的方法可以在QWidget的子节点上触发hoverenter / hoverleave事件?

时间:2018-03-02 09:40:58

标签: c++ qt

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

QWidget似乎拥有大部分管道来完成这项任务,但它隐藏在protected之后。

我真的想避免继承QWidget,如果我可以避免它,我真的不想更改小部件的样式表。

[1]就我而言,我有三个小部件,而不是两个小部件。

1 个答案:

答案 0 :(得分:1)

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

#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方法将设置小部件并将其推送到向量中。

在表单类中有一个私有过滤器实例:

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来设置背景颜色,但您可以使用您喜欢的任何策略,即重置窗口小部件调色板。