12

私はQtを使ったプログラミングに比較的慣れていないので、質問がありました。短縮版:

スーパークラスで定義された信号を継承するにはどうすればよいですか?

他の誰かがうまく作成したQTWidgetsをサブクラス化して、デフォルトの動作の一部を変更しようとしています。

//Plot3Dはシグナル「rotationChanged」を定義するQWidgetです
クラスmatLinePlot:public QObject、public Plot3D {

    Q_OBJECT;
        //等...
公衆:
       //等...

        // Plot3Dのシグナル「rotationChanged」をキャッチし、それを使って魔法をかけます。
    void initPlot(){
              QObject :: connect(this、SIGNAL(rotationChanged(double、double、double))、
            this、SLOT(myRotationChanged(double、double、double)));
    }
};

問題はQObject::connect行にあります。私がやりたいのは、rotationChanged SIGNAL(qwt3D_plot.hから)をローカル関数/SLOT-"myRotationChanged"に接続することです。ただし、これを行うと、実行時に次のようになります。

Object :: connect:そのようなシグナルはありませんmatLinePlot :: rotationChanged(double、double、double)

C:...\matrixVisualization.hで。もちろん、私はそれrotationChangedが入っていないことを知っていますmatrixVisualization.h-それは入っていますが、私はすべてから継承しているので大丈夫だqwt_plot3D.hと思いました。Plot3Dでも、考えてみると、SIGNALとSLOTはマクロなので、MOCは継承を知らない/気にしないと思います。

MOCとSIGNALS/SLOTSは継承などについて知らないようですので、これが私の質問につながります。別の場所で定義されたウィジェットをサブクラス化して、ウィジェットの信号にアクセスするにはどうすればよいですか?

カプセル化を使用してこのようなことを実現する方法の例はたくさんありますが、継承を使用してこれを行う方法がわかりません。

これがばかげた質問である場合は申し訳ありません-私は明らかな何かを見逃しているように感じます。

4

4 に答える 4

10

問題は多重継承だと思います:

class matLinePlot : public QObject, public Plot3D
...

それは?Plot3Dのサブクラスだと思います。QObjectこの場合、あなたはするべきです

class matLinePlot : public Plot3D
...

代わりは。

于 2009-05-10T11:23:49.507 に答える
2

SIGNAL(x) と SLOT(x) は、文字列リテラルを生成するマクロです。実行時に、生成されたリテラルの文字列比較を使用して、スロットとシグナルが照合されます。

(mdecさんのコメントに追記すればよかったのですが、担当者が足りません)

于 2009-05-10T05:13:47.727 に答える
1

Plot3D::rotationChangedシグナルがパブリックまたは保護されている場合は機能すると思います。信号がプライベートではないことを確認しますか?

編集:

具体的な参考資料は見つかりませんでしたが、シグナルは常に公開されていると結論付ける必要があります。少なくともここで行ったテストでは、クラスのプライベートセクションで宣言されていても、シグナルに接続できることが示されているようです。

また、connectステートメントでQObjectのサブクラスを使用して、QObjectで宣言されたシグナルを接続できることを確認しました。これにより、シグナルは確実に継承できます。ここにある他の回答やコメントに見られるように、問題は他の場所にあるに違いありません。

于 2009-05-10T03:45:36.583 に答える
0

不正解 -> コメントを参照してください。

私は Uni で Qtopia を使用しています。接続用の SIGNAL パラメーターと SLOT パラメーターの間隔について誰かが言ったことを思い出したと思います。

使ってみて

QObject::connect(this, SIGNAL(rotationChanged(double,double,double)),
            this, SLOT(myRotationChanged(double,double,double)));

C++ は空白に敏感ではないため、直感的ではないように思えますが、信号とスロットを接続するときに Qtopia/QT が使用する魔法の一部と関係があると思います。これは Qtopia にのみ当てはまるかもしれませんし、間違っているかもしれませんが、試してみてください。さらに、シグナルは公開または保護されており、適切なヘッダー ファイルが含まれていますか?

于 2009-05-10T04:50:25.163 に答える