【问题标题】:Class derived from QwtPlotZoomer not working as intended从 QwtPlotZoomer 派生的类未按预期工作
【发布时间】: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 我知道我只是在上面指出它

标签: c++ qt qt5 qwt


【解决方案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。
  • 我现在真的需要走了,也许我们可以改天继续?非常感谢您回答我的帖子:)
猜你喜欢
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2021-10-13
  • 2019-02-18
  • 2021-08-01
相关资源
最近更新 更多