连接基本信号mousepress

时间:2016-06-03 18:57:48

标签: c++ qt signals-slots qcustomplot

我正在使用QCustomPlot,我正在尝试编写一个代码,一旦用户按下鼠标并拖动它就会重新调整我的轴。我做了:

   connect(ui->plot, SIGNAL(mousePress(QMouseEvent *event)), this,  SLOT(mousedrag(QMouseEvent*))); 

我一直在接受:

  

QObject :: connect:没有这样的信号QCustomPlot :: mousePress(QMouseEvent   *事件)

但是mouseWheel(QWheelEvent*)以及mouseWheelmousePress都在QCustomPlot库中声明了信号。

我哪里错了?此外,如果某人有更好的信号来触发我的功能mousedrag(QMouseEvent*),它会根据y1轴重新调整y2轴,我会打开建议。

2 个答案:

答案 0 :(得分:0)

使用" old"信号/插槽连接语法,即使用SIGNAL语句中的SLOTconnect()宏的语法,您不应提供参数的名称,仅他们的类型。

换句话说:

SIGNAL(mousePress(QMouseEvent *event)) // WRONG, parameter name in there!
SIGNAL(mousePress(QMouseEvent *)) // GOOD
SIGNAL(mousePress(QMouseEvent*)) // BETTER: already normalized

只需将您的陈述改为

即可
connect( ui->plot, SIGNAL(mousePress(QMouseEvent*)), 
         this,     SLOT(mousedrag(QMouseEvent*)) ); 

答案 1 :(得分:0)

传递给connect的信号签名无效。参数名称不是签名的一部分。您还应删除任何空格,以便connect不必对签名进行规范化。规范化签名没有不必要的空格,最外面的const和引用必须被删除,例如SIGNAL(textChanged(QString)) SIGNAL(textChanged(const QString &))

                                                 remove
                                                 vvvvv
connect(ui->plot, SIGNAL(mousePress(QMouseEvent *event)), this,             
        SLOT(mousedrag(QMouseEvent*)));

请改为:

// Qt 5
connect(ui->plot, &QCustomPlot::mousePress, this, &MyClass::mousedrag);
// Qt 4
connect(ui->plot, SIGNAL(mousePress(QMouseEvent*)), SLOT(mousedrag(QMouseEvent*));

边栏

TL; DR:这种API设计本质上是一个错误。

事件和信号/插槽机制是QCustomPlot设计混合在一起的不同范例。连接到这些信号的插槽只能以非常具体和有限的方式使用。您必须完全使用它们,就好像它们是派生类中的重载一样。这意味着:

  1. 每个信号必须连接0或1个插槽。

  2. 连接必须是直接或自动连接到同一线程中的对象。

    您不能使用排队连接:当控件返回事件循环时,事件已被破坏,插槽/仿函数将使用悬空指针。