C /否这样的插槽 - 继承
c++/ no such slot - Inheritance
此代码:
MyAxis *ax;
ax = static_cast<MyAxis*>(ui->customPlot->axisRect()->addAxis(QCPAxis::atLeft));
connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)),
ax, SLOT(MyAxis::rescale(QCPRange)));
给我这个运行时错误:
qobject ::连接:plotwindow.cpp中没有这样的插槽
QCPAxis::MyAxis::rescale(QCPRange)
:267
通常,当我收到这样的错误时,我将Q_OBJECT
宏添加到类中并运行qmake
进行修复,但这这次无效。
这是班级的声明:
class MyAxis : public QCPAxis
{
Q_OBJECT
public:
void setRefAxis(QCPAxis *refAxis);
void setScale(double newScale);
public Q_SLOTS:
virtual void rescale(const QCPRange &range);
private:
double scale;
QCPAxis *ref;
};
将声明更改为public slots:
没有任何区别。
我认为您在这里试图做的事情有问题:
ui->customPlot->axisRect()->addAxis(QCPAxis::atLeft)
返回QCPAxis
,而不是MyAxis
类。假设QCPAXIZ需要100个字节的内存,而yaxis则需要110个字节,然后您正在尝试这样做:
A_110_Byte_Type* p110Bytes = static_cast<110-bytes *> (<100-bytes>); // not real code!
我看不出如何工作。您正在调用的函数返回qcpaxis,而您不能仅仅因为它们共享同一基础类别而将其转换为yaxis ...它有点像拥有福特 - 菲斯塔(Ford-fiesta)并说:"现在它是一辆法拉利"仅仅因为它们具有相同的基本类型的"汽车"。
因此,目前我认为您是未定义的行为...
您想做什么? - 您可以将QCPAXI的值复制到您的yryaxis中(使用复制构造函数 - 我认为您需要其中之一来执行此操作)
您不能仅将现有轴施加到MyAxis*
。您需要实例化新的MyAxis
并将其分配给图表:
QCPGraph *graph = new QCPGraph(this);
MyAxis *ax = new MyAxis(graph);
graph->setValueAxis(ax);
connect(...);
未来的提示:避免使用检查替代方案的static_cast<>()
(在此,qobject_cast<>()
,否则dynamic_cast<>()
)。这将有助于确定无效的假设。
qt存储一些从QObject
继承的类的元信息。这些信息之一是班级的插槽。通过静态铸造对象,这些元信息不会在铸件中进行更新,因此您的铸造对象的元信息不包含您在MyAxis
类中实现的插槽。这就是为什么它不能在运行时将信号连接到铸造的对象的原因。即使您在MyAxis
类中重新进来一个虚拟插槽,通过静态铸造对象的静态铸造对象的插槽指向旧插槽,并且不会升级以指向重新成像的插槽。
更新:通过使用qobject_cast
(这是QT对象的安全铸造方式),您可以看到它的铸造对象为null。
-
QT的MOC生成器非常限制:因此,写作相同签名:
connect(..., SLOT(...(const QCPRange &)));
-
在其中一个H文件中缺少语句:
Q_DECLARE_METATYPE(QCPRange)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 类继承自QLabel,为什么不调用自定义插槽?
- 信号/插槽基类多继承
- C /否这样的插槽 - 继承
- Qt UI 插槽不是由从基类继承的信号调用的
- 无法识别继承类的插槽