出于样式目的,我试图让一组小部件中的所有小部件都采用某种背景,如果指针进入任何这些小部件;即,如果指针位于小部件A的包含矩形内,则A和小部件B都应该改变其背景。同样,如果指针进入B,那么A也应采用相同的背景。如果指针位于A和B之外,背景应该自然地回退到非悬停背景。
QWidget似乎有大部分的管道来完成这项工作,但它隐藏在protected
背后。
我真的想避免继承QWidget,如果我可以避免它,我真的不想改变小部件的样式表。
[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
来设置背景颜色,但您可以使用您喜欢的任何策略,即重置窗口小部件调色板。