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

问题描述 投票:0回答:1

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

QWidget似乎有大部分的管道来完成这项工作,但它隐藏在protected背后。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.