2

クラスでいくつかのアクションを実行するスロット関数が定義されています。私のクラスのユーザーが独自のスロット関数を定義できるようにする可能性を作成したかった (私のクラスの関数を自分のものに置き換える)。私はこのようにスロット関数へのポインタによってそれを達成しようとしました:

class asd {
    Q_OBJECT

private:
    void ( asd::*m_funcTrigger )( QAction* );

public:
    asd();
    // and some method to pass the pointer

private slots:
    void actionTrigger( QAction* );

};

コンストラクター:

asd::asd() {
    // set the slot function from class as default
    m_funcTrigger = &asd::actionTrigger;

    // m is a QMenu object
    connect(m, SIGNAL(triggered(QAction*)), this, SLOT(m_funcTrigger(QAction*)));
}

actionTrigger の実装は重要ではないと思います。

したがって、actionTrigger を SLOT() に入れると、問題なく動作します。そこに m_funcTrigger を配置しても、何も起こりません (Qt によってスロットが見つかりません)。ポインターがクラスのスロットセクションにないため、それは確かだったので、そこに置きました:

private slots:
    void ( asd::*m_funcTrigger )( QAction* );
    void actionTrigger( QAction* );

しかし、奇妙なエラーが発生しました:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): エラー MSB6006: "cmd.exe" がコード 1 で終了しました。

これに対処する方法がまったくわかりません。

編集:

Qt で見つからない理由は次のとおりだと思います。インターネットで調べたところ、SLOT() は、SLOT に渡されたメソッドの識別子名を含む単純な const char* を返すだけなので、Qt は完全にそうではありません。ポインターが何を指しているのかわかりません。m_funcTrigger( QAction* ) 関数を処理するだけです。

クラスのユーザーが SLOT(hisOwnFunction()) をスロット関数を設定する関数に渡す必要がある別のソリューションを作成しました (後でここに配置します)。クラスはシグナルスロットのアイデアを使用しているため、Qt に依存しているため、ポインタの代わりにそこに SLOT を渡しても問題ないと思います。どう思いますか?

4

1 に答える 1

1
  1. スロットを仮想にすることができるので、派生クラスはそれをオーバーライドできます。

  2. m_funcTrigger自分のスロットを自分で呼び出すことができます。

    private slots:
        void actionTrigger_slot( QAction* a)
        {
         m_funcTrigger(a);
        }
    
于 2012-08-22T07:51:37.617 に答える