c++/qt - 没有这样的插槽 - 继承

标签 c++ qt signals-slots qcustomplot

这段代码:

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::connect: No such slot QCPAxis::MyAxis::rescale(QCPRange) in plotwindow.cpp: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 个字节的内存,而 MyAxis 占用 110 个字节,那么您正在尝试这样做:

A_110_Byte_Type* p110Bytes = static_cast<110-bytes *> (<100-bytes>); // not real code!

我不明白这是怎么回事。您正在调用的函数返回一个 QCPAxis 并且您不能仅仅因为它们共享相同的基类就将它转换为 MyAxis ......这有点像拥有一辆福特嘉年华并说,“现在它是一辆法拉利”只是因为它们具有相同的“汽车”基本类型。

所以目前我认为你陷入了未定义的行为......

你想做什么? - 您可以将 QCPAxis 的值复制到您的 MyAxis 中(使用复制构造函数 - 我认为您需要其中一个来执行此操作)

关于c++/qt - 没有这样的插槽 - 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37958129/

相关文章:

c++ - 知道 QObject 名称是否已更改的最佳方法是什么

qt - 将多个信号连接到 Qt 中的单个插槽

c++ - 获取虚基类的继承路径

c++ - 为什么 g++ 无法找到已安装的系统包含?

python - QStyledItemDelegate (PySide/PyQt/Qt) 中 createEditor 的父级是什么?

python - pyqt 动态生成 QMenu Action 并连接

qt - 连接到 QtScript(在 Qt 4.5.2 上)中的信号的函数不会触发

c++ - 带有 Visual Studio 2013 的 libffi

c++ - GCC 交叉编译为 i586 架构 (Vortex86DX)

c++ - 使用 Qt 设置 Code::Blocks