2017-03-23 14 views
1

私は同じスロットに、異なるパラメータで信号を再接続しようとしているを使用して、以前の接続信号のスロットのパラメータを変更します。これは、パラメータやラムダ関数を使わずに別のスロットに同じ信号を再接続したいのであればうまくいくでしょうが、このようにする必要があります。のQt - ラムダ関数

connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varA);}); 
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varB);}); 

function1varA、決してvarBを受ける:まず

私はこのような何かを試してみました。

接続のリストを保持することでこれを行う方法が見つかりました。パラメータを変更する場合は、古いものを切断して新しい接続を作成します。すべての接続を追跡することを必要とせずに、この変更を行うとdiscconnect /接続プロセスを通過するための方法があるかどうか、私は知りたいのですがどのような

です。

+0

は、 "ID" VARを忘れ@AlexanderVX。私は私の例からそれを削除することを忘れました、それは無関係です。あなたの例について私はあなたが私に何を見せようとしたのか分かりませんが、両方のパラメータが同じパラメータを持っていて、それは私の問題ではありません。しかし、ありがとう。 – RubenC

答えて

0

つのソリューションは、私の心に来る:

  1. キャプチャvarを参照して、再接続する代わりに変更してください。

    class Foo : public QWidget { 
        Q_OBJECT 
        int remove_btn_var; 
        int varA = 10, varB = 20; 
        QPushButton remove_btn; 
        void function1(int); 
    public: 
        Foo() { 
        remove_btn_var = varA; 
        connect(&remove_btn, &QPushButton::clicked, [&] { function1(remove_btn_var); }); 
        } 
        void switch() { 
        remove_btn_var = varB; 
        } 
    }; 
    
  2. 変更できるボタンにプロパティを追加します。

    static const char k_function1_var[] = "function1_var"; 
    class Foo : public QWidget { 
        Q_OBJECT 
        int varA, varB; 
        QPushButton remove_btn; 
        void function1(int); 
    public: 
        Foo() { 
        remove_btn.setProperty(k_function1_var, varA); 
        connect(&remove_btn, &QPushButton::clicked, [this] { 
         function1(remove_btn.property(k_function1_var).toInt()) 
        }); 
        } 
        void switch() { 
        remove_btn.setProperty(k_function1_var, varB); 
        } 
    }; 
    
+0

あなたのアイデアに基づいて解決策を思いつきました。私のクラスはID番号を保持する変数を持っています(名前に 'var_id'を付けてください)。 今私はちょうど'接続({機能1(myClass-> var_id);} remove_btn、&のQPushButton ::クリック、[本]);使用する方法') ' AND(機能1'内部 'var_id'値を変更し、それは、接続を変更します このアイデアは以前は私の心を少し横切っていましたが、どういうわけか私はそれを無視していました。 – RubenC

0

あなたはQPushButton::clicked信号が1つのパラメータ(bool checked)を有しているので、それを使用するのに十分であるべきで、std::bindを使用することができるかもしれない:

auto f = std::bind(function1, varA); // checked argument ignored (std::placeholders::_1) 
connect(remove_btn,&QPushButton::clicked,f); 
+0

bind()が動作していないので、「overloaded bind()...のインスタンスがありません」というエラーが表示されますが、適切な引数を使用していましたので、他の例もチェックしました。しかし、とにかく私は私の問題の解決策を見つけました。@ Xander – RubenC