从 QwtPlotZoomer 派生的类未按预期工作

Posted

技术标签:

【中文标题】从 QwtPlotZoomer 派生的类未按预期工作【英文标题】:Class derived from QwtPlotZoomer not working as intended 【发布时间】:2018-12-21 09:03:27 【问题描述】:

我正在编写一个派生自QwtPlotZoomer 的类MyPlotZoomerMyPlotZoomerQwtPlotZoomer 的不同之处在于,为了激活和绘制缩放矩形,用户必须按住 ctrl 键,单击并拖动,然后释放鼠标按钮。

为了实现这一点,我通过以下方式覆盖了QWtPlotZoomerwidgetMouseReleaseEventwidgetMousePressEventwidgetMouseMoveEvent中的三个方法:

#include <QWidget>
#include "qwt_plot.h"
#include "qwt_plot_zoomer.h"
#include <QMouseEvent>

class MyPlotZoomer : public QwtPlotZoomer


  public:
    // constructor
        explicit MyPlotZoomer( QWidget *canvas );
    // destructor

    // function prototypes

    // data
  protected:
    // function prototypes
    virtual void widgetMouseReleaseEvent( QMouseEvent *mouse_event ) override
        if( mouse_event->modifiers() & Qt::ControlModifier )
          QwtPlotZoomer::widgetMouseReleaseEvent( mouse_event );
        
    ;

    virtual void widgetMousePressEvent( QMouseEvent *mouse_event ) override
        if( mouse_event->modifiers() & Qt::ControlModifier )
          QwtPlotZoomer::widgetMousePressEvent( mouse_event );
        
    ;
    virtual void widgetMouseMoveEvent( QMouseEvent *mouse_event ) override
        if( mouse_event->modifiers() & Qt::ControlModifier )
          QwtZoomer::widgetMouseMoveEvent( mouse_event );
        
    ;


;

但是,按 ctrl 键然后绘图什么也不做。缩放矩形不显示。我在这里做错了什么?

【问题讨论】:

在我看来你忘记了 Q_OBJECT,顺便说一句 @AlexanderChernin,如果不涉及信号/插槽,则不需要存在Q_OBJECT @vahancho 我知道我只是在上面指出它 【参考方案1】:

QwtPlotZoomer 的基类之一是 QwtEventPattern,它允许更改使用的键/鼠标组合类型。 所以没有理由从 QwtPlotZoomer 派生,因为 setKeyPattern/setMousePattern 以更简单的方式进行。

使用的鼠标/键模式取决于分配给缩放器的状态机 ( QwtPickerMachine )。查看相应的类文档。

【讨论】:

阅读您的回答后,我使用 QwtPlotZoomer::setMousePattern( QwtEventPattern::MouseSelect1, Qt::LeftButton, Qt::ControlModifier ) 解决了我的问题。【参考方案2】:

你需要更换

if( mouse_event->modifiers() & Qt::ControlModifier )

if( mouse_event->modifiers().testFlag(Qt::ControlModifier) )

if( mouse_event->modifiers() | Qt::ControlModifier )

在其他地方也是如此

加法。 要放大/缩小,您需要在发布事件上调用 QwtPlotZoomer::zoom()。在按下事件开始创建矩形时,在移动中 - 分别修改矩形并在释放时以该矩形作为参数调用缩放

【讨论】:

@megamonium 你能看看修改器的内容吗? 所以我添加了这一行“std::cout modifiers() 没错(按下控制键)。尝试输出:std::cout modifiers().testFlag(Qt::ControlModifier) 返回值为1。 我现在真的需要走了,也许我们可以改天继续?非常感谢您回答我的帖子:)

以上是关于从 QwtPlotZoomer 派生的类未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Specflow 场景大纲未按预期工作

基类未捕获 C++ 派生类异常

从数组中删除特定项目,未按预期工作

Sprite 套件 CGPoint 未按预期工作

从 Android 联系人数据库获取联系人 ID 未按预期工作

无法从异步函数获取返回值,等待未按预期工作(Vue API 服务)