连接基本信号 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*)
以及 mouseWheel
和 mousePress
都在 QCustomPlot
库中声明了信号。
我哪里错了?此外,如果有人有更好的信号来触发我的函数 mousedrag(QMouseEvent*)
,它根据 y1 轴重新缩放 y2 轴,我愿意征求建议。
当使用 "old" signals/slot 连接语法时,即在 connect()
语句中使用 SIGNAL
和 SLOT
宏的语法,你不应该提供参数的名称,只提供它们的类型。
换句话说:
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 中的重载来使用它们。这意味着:
每个信号必须有 0 个或 1 个插槽与之连接。
连接必须直接或自动连接到同一线程中的对象。
您不能使用排队连接:当控件 returns 进入事件循环时,事件已被销毁并且 slot/functor 将使用悬挂指针。
我正在使用 QCustomPlot
,我正在尝试编写一段代码,一旦用户按下鼠标并拖动,它就会重新缩放我的坐标轴。我做到了:
connect(ui->plot, SIGNAL(mousePress(QMouseEvent *event)), this, SLOT(mousedrag(QMouseEvent*)));
我不断得到:
QObject::connect: No such signal QCustomPlot::mousePress(QMouseEvent *event)
但是 mouseWheel(QWheelEvent*)
以及 mouseWheel
和 mousePress
都在 QCustomPlot
库中声明了信号。
我哪里错了?此外,如果有人有更好的信号来触发我的函数 mousedrag(QMouseEvent*)
,它根据 y1 轴重新缩放 y2 轴,我愿意征求建议。
当使用 "old" signals/slot 连接语法时,即在 connect()
语句中使用 SIGNAL
和 SLOT
宏的语法,你不应该提供参数的名称,只提供它们的类型。
换句话说:
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 中的重载来使用它们。这意味着:
每个信号必须有 0 个或 1 个插槽与之连接。
连接必须直接或自动连接到同一线程中的对象。
您不能使用排队连接:当控件 returns 进入事件循环时,事件已被销毁并且 slot/functor 将使用悬挂指针。