3

このコード:

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: QCPAxis::MyAxis::rescale(QCPRange)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:ても違いはありませんでした。

4

4 に答える 4

1

ここであなたがやろうとしていることに問題があると思います:

ui->customPlot->axisRect()->addAxis(QCPAxis::atLeft)

クラスQCPAxisではなく a を返します。MyAxisQCPAxiz が 100 バイトのメモリを使用し、MyAxis が 110 バイトを使用するとします。

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

それがどのように機能するかわかりません。呼び出している関数は QCPAxis を返しますが、同じ基本クラスを共有しているという理由だけでそれを MyAxis に変換することはできません... Ford-Fiesta を持っていて、「今はフェラーリです」と言っているようなものです。 「「車」の基本タイプが同じだからです。

だから現時点では、あなたは未定義の行動に陥っていると思います...

あなたがやろうとしていることは何ですか?- QCPAxis の値を MyAxis にコピーできます (コピー コンストラクターを使用 - これを行うには、それらのいずれかが必要だと思います)。

于 2016-06-22T06:41:21.033 に答える
-1
  1. Qt の moc-generator は非常に制限的です: したがって、同じ署名で書きます:

    connect(..., SLOT(...(const QCPRange &)));
    
  2. h ファイルの 1 つで、次のステートメントが欠落しています。

        Q_DECLARE_METATYPE(QCPRange)
    
于 2016-06-22T09:45:04.393 に答える