连接基本信号 mousepress

connecting a basic signal mousepress

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

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

我不断得到:

QObject::connect: No such signal QCustomPlot::mousePress(QMouseEvent *event)

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

我哪里错了?此外,如果有人有更好的信号来触发我的函数 mousedrag(QMouseEvent*),它根据 y1 轴重新缩放 y2 轴,我愿意征求建议。

当使用 "old" signals/slot 连接语法时,即在 connect() 语句中使用 SIGNALSLOT 宏的语法,你不应该提供参数的名称,只提供它们的类型。

换句话说:

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*)) ); 

传递给 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 设计本质上是一个错误。

事件和signal/slot机制是QCustomPlot的设计混合在一起的不同范例。连接到这些信号的插槽只能以非常特定和有限的方式使用。您必须完全按照派生 class 中的重载来使用它们。这意味着:

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

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

    您不能使用排队连接:当控件 returns 进入事件循环时,事件已被销毁并且 slot/functor 将使用悬挂指针。