Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未调用mouseReleaseEvent_C++_Qt_Svg - Fatal编程技术网

C++ 未调用mouseReleaseEvent

C++ 未调用mouseReleaseEvent,c++,qt,svg,C++,Qt,Svg,我试图实现一种方法,在按下SVG按钮时更改背景,在释放SVG按钮时重置背景。我的问题是,当我隐藏调用MousePresseEvent的QSvgWidget时,mouseReleaseEvent没有被调用 这是我的密码: SvgButton.cpp 和BaseNavigationButton.cpp #include "BaseNavigationButton.h" const int kButtonWidth = 140; const int kButtonHeight = 70; Base

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

这是我的密码:

SvgButton.cpp

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;
    }
}
#包括“BaseNavigationButton.h”
常量int kButtonWidth=140;
常数int kButtonHeight=70;
BaseNavigationButton::BaseNavigationButton(QString backgroundImagePath、QString pressedBackgroundImagePath、QWidget*parent)
:SVG按钮(backgroundImagePath,父级)
{
此->设置最小尺寸(kButtonWidth、kButtonHeight);
如果(!pressedBackgroundImagePath.isNull())
{
SVGDom pressedBackgroundImage(pressedBackgroundImagePath);
_按BackgroundImageWidget=new QSvgWidget();
_按BackgroundImageWidget->load(按BackgroundImageByteArray());
layout()->addWidget(_pressedBackgroundImageWidget);
_按BackgroundImageWidget->hide();
}
其他的
{
_按BackgroundImageWidget=NULL;
}
}
void BaseNavigationButton::mouseReleaseEvent(QMouseEvent*事件)
{
qDebug()setVisible(false);
_按BackgroundImageWidget->setVisible(true);
//_backgroundImageWidget->show();
//_按BackgroundImageWidget->hide();
}
QPushButton::mouseReleaseEvent(事件);
//释放();
}
void BaseNavigationButton::MousePresseEvent(QMouseEvent*事件)
{
qDebug()setVisible(true);
_按BackgroundImageWidget->setVisible(假);
}
QPushButton::MousePresseEvent(事件);
//按下发射();
}
BaseNavigationButton::~BaseNavigationButton()
{
如果(按BackgroundImageWidget)
{
删除按BackgroundImageWidget;
}
}

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

当你隐藏一个
QWidget
时,它会失去焦点,而一个小部件——或者一些子小部件——必须有焦点才能使事件在其上工作

试试这个简单的例子:

  • 当光标位于按钮上方时,按下鼠标按钮
  • 将指针移出按钮而不释放鼠标按钮
  • 松开鼠标按钮
  • 如您所见,这不会触发单击的按钮--
    clicked
    是一个
    mousePressEvent
    ,后跟一个
    mouseereleaseEvent
    --事件

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

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

    如果“鼠标按下样式行为”的意思是:“当我按下鼠标按钮时,我希望我的小部件样式改变”


    您可以使用
    setStyleSheet
    函数将CSS样式应用到小部件中。请参见

    谢谢您的解释和您的时间(+1),我已经解决了这个问题,只是我认为有一些解决办法。我能做些什么来实现“鼠标按下”式行为?@flatronka我在回答中添加了几行,再次检查。
    #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;
        }
    }