从 QwtPlotZoomer 派生的类未按预期工作
Posted
技术标签:
【中文标题】从 QwtPlotZoomer 派生的类未按预期工作【英文标题】:Class derived from QwtPlotZoomer not working as intended 【发布时间】:2018-12-21 09:03:27 【问题描述】:我正在编写一个派生自QwtPlotZoomer
的类MyPlotZoomer
。 MyPlotZoomer
与 QwtPlotZoomer
的不同之处在于,为了激活和绘制缩放矩形,用户必须按住 ctrl 键,单击并拖动,然后释放鼠标按钮。
为了实现这一点,我通过以下方式覆盖了QWtPlotZoomer
、widgetMouseReleaseEvent
、widgetMousePressEvent
和widgetMouseMoveEvent
中的三个方法:
#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 派生的类未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章