mouseReleaseEvent is not called

mouseReleaseEvent is not called

本文关键字:called not is mouseReleaseEvent      更新时间:2023-10-16

我试图实现一种在按下 SVG 按钮时更改背景并在释放时重置的方法。我的问题是,当我隐藏调用鼠标新闻事件的QSvgWidget时,没有调用mouseReleaseEvent。

这是我的代码:

SvgButton.cpp

#include "SvgButton.h"
SVGButton::SVGButton(QByteArray backgroundImage, QWidget *parent) :
    QPushButton(parent)
{
    this->init(backgroundImage);
}
SVGButton::SVGButton(QString backgroundImagePath, QWidget *parent) :  QPushButton(parent)
{
    SVGDom normalBackgroundImage(backgroundImagePath);
    this->init(normalBackgroundImage.byteArray());
}
void SVGButton::init(QByteArray backgroundImage)
{
    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    _backgroundImageWidget = new QSvgWidget();
    _backgroundImageWidget->load(backgroundImage);
    setLayout(new QHBoxLayout(this));
    layout()->addWidget(_backgroundImageWidget);
    this->setFlat(true);
}
void SVGButton::select()
{
    this -> setStyleSheet("background-color:rgba(0, 0, 0, 10);");
}
void SVGButton::deselect()
{
    this -> setStyleSheet("background-color:rgba(0, 0, 0, 0)");
}
int SVGButton::tag()
{
    return _tag;
}
void SVGButton::setTag(int tag)
{
    _tag = tag;
}
void SVGButton::paintEvent(QPaintEvent *)
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
SVGButton::~SVGButton()
{
    delete _backgroundImageWidget;
}

BaseNavigationButton.cpp

#include "BaseNavigationButton.h"
const int kButtonWidth = 140;
const int kButtonHeight = 70;
BaseNavigationButton::BaseNavigationButton(QString backgroundImagePath, QString pressedBackgroundImagePath, QWidget *parent)
    : SVGButton(backgroundImagePath, parent)
{
    this->setMinimumSize(kButtonWidth, kButtonHeight);
    if (!pressedBackgroundImagePath.isNull())
    {
         SVGDom pressedBackgroundImage(pressedBackgroundImagePath);
        _pressedBackgroundImageWidget = new QSvgWidget();
        _pressedBackgroundImageWidget->load(pressedBackgroundImage.byteArray());
        layout()->addWidget(_pressedBackgroundImageWidget);
       _pressedBackgroundImageWidget->hide();
    }
    else
    {
        _pressedBackgroundImageWidget = NULL;
    }
}
void BaseNavigationButton::mouseReleaseEvent(QMouseEvent * event)
{
    qDebug() << "SVGButton::mouseReleaseEvent";
    if (_pressedBackgroundImageWidget) {
        _backgroundImageWidget->setVisible(false);
        _pressedBackgroundImageWidget->setVisible(true);
        //_backgroundImageWidget->show();
        //_pressedBackgroundImageWidget->hide();
    }
    QPushButton::mouseReleaseEvent(event);
    //emit released();
}
void BaseNavigationButton::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "SVGButton::mousePressEvent";
    if(_pressedBackgroundImageWidget)
    {
        _backgroundImageWidget->setVisible(true);
        _pressedBackgroundImageWidget->setVisible(false);
    }
    QPushButton::mousePressEvent(event);
   // emit pressed();
}
BaseNavigationButton::~BaseNavigationButton()
{
    if (_pressedBackgroundImageWidget)
    {
        delete _pressedBackgroundImageWidget;
    }
}

SVGDom基本上只是从SVG图像创建一个字节数组。代码有效,相对正确,唯一的问题是我上面描述的。

当你隐藏一个QWidget时,它会失去焦点,并且 Widget - 或一些子小部件 - 必须具有焦点才能使事件在其上工作。

试试这个简单的例子:

  1. 当光标悬停在按钮上时,按鼠标按钮。
  2. 将指针移出按钮而不释放鼠标按钮。
  3. 松开鼠标按钮。

如您所见,这不会触发单击的按钮 - clicked是一个mousePressEvent,后跟一个mouseReleaseEvent - 事件。

因此,您无法从隐藏对象接收鼠标按钮事件。

我该怎么做才能实现"鼠标按下"样式的行为?

如果"鼠标按下样式

行为">是指:">我希望在按下鼠标按钮时更改我的小部件样式"。

好吧,您可以使用setStyleSheet函数并将CSS样式应用于您的小部件。查看Qt样式表示例