不调用mouseReleaseEvent

时间:2014-09-16 14:52:28

标签: c++ qt svg

我尝试实现一种在按下SVG按钮时更改背景的方法,并在释放时重置。我的问题是,当我隐藏调用mousePressEvent的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图像创建一个ByteArray。代码工作,它是相对正确的,唯一的问题是我上面描述的。

1 个答案:

答案 0 :(得分:1)

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

试试这个简单的例子:

  1. 当光标位于按钮上时按下鼠标按钮。
  2. 将指针移出按钮而不释放鼠标按钮。
  3. 释放鼠标按钮。
  4. 正如您将看到的,这不会触发点击按钮 - clickedmousePressEvent后跟mouseReleaseEvent - 事件。​​

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

    如何实施“鼠标按下”样式行为?

    如果通过“鼠标按下样式行为”,您的意思是:“我希望在按下鼠标按钮时更改窗口小部件样式”

    好吧,您可以使用setStyleSheet函数并将CSS样式应用于窗口小部件。见Qt Style Sheets Examples