我试图实现一种方法,可以在按下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。该代码有效,它是相对正确的,唯一的问题是我上面描述的。

最佳答案

隐藏QWidget时,它会失去焦点,并且Widget(或某些子Widget)必须具有焦点,事件才能在其上进行。

试试这个简单的例子:


当光标位于按钮上方时,按鼠标按钮。
将指针移出按钮而不释放鼠标按钮。
释放鼠标按钮。


如您所见,这不会触发单击的按钮-clickedmousePressEvent,后跟mouseReleaseEvent-事件。

因此,您不能从隐藏的对象接收鼠标按钮事件。

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

如果用“鼠标按下的样式行为”来表示:“我希望在我按下鼠标按钮时更改小部件样式”。

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

关于c++ - 没有调用mouseReleaseEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25872012/

10-11 11:09