2017-04-05 14 views
1

Iは、引数としてゾル(メンバメソッドへのポインタ)を有する方法で定義されたC++クラスを持っている:スロット(メソッド部材へのポインタ)メソッドへの引数としてSIP

MyClass : public QDialog, private Ui::MyClassBase 
{ 
    Q_OBJECT 
    public: 
    MyClass(QWidget *parent = nullptr); 

    void connectValueChanged(const QList<QWidget *> &widgets, void (MyClass::*slot)()); 
} 

void MyClass::connectValueChanged(const QList<QWidget *> &widgets, void (MyClass::*slot)()) 
{ 
    Q_FOREACH (QWidget *widget, widgets) 
    { 
    connect(w, &QWidget::signal, this, slot); 
    } 
} 
定義されているよう connectValueChangedは、SIPファイルで使用することはできません

、私は構文エラーを取得します。


また、私は成功せずconst char *slotを使用しようとしました:SIPファイルで

void MyClass::connectValueChanged(const QList<QWidget *> &widgets, const char *slot); 

私はこれを達成するために、いくつかのMethodCodeを必要として、私はエラー(no matching function for call to ‘MyClass::connectValueChanged)を取得します。


たぶん、いくつかのヒント:


私はSIPでの引数としてスロットを持つメソッドを定義するにはどうすればいいの?

私はこれがいくつか必要だと思う。MethodCode私は現時点では書くことができません。 私は私はありませんので、私は、ポインタ・ツー・メンバーを削除した

+0

?どのように 'connectValueChanged'を呼びますか? – Svalorzen

+0

私はちょうどそのエラーで質問を更新しました。 –

+0

関数を呼び出す場所の実際のコードを表示できますか? – Svalorzen

答えて

0

(一部MethodCodeでPythonの方法では、おそらく入れ、CPP方式でconst char *slotを使用しないよう)Qt5新しいシグナル/スロット接続を使用したいと思いますこれが現時点でサポートされているかどうかを確認してください。信号/スロット方式const char*を使用する場合は、そうでない場合はもちろん、不一致エラーが発生するような方法を実装する必要があります。

class MyQObj : public QObject { 
    Q_OBJECT 

    public: 
     MyQObj(QObject * parent = nullptr); 

     void connectValueChanged(const QList<QObject*> &objects, const char * slot); 

    public slots: 
     void mySlot(); 
}; 

... 

MyQObj::MyQObj(QObject * parent) : QObject(parent) {} 

void MyQObj::connectValueChanged(const QList<QObject*> &objects, const char * slot) { 
    for (auto p : objects) 
     QObject::connect(p, SIGNAL(objectNameChanged(QString)), this, slot); 
} 

void MyQObj::mySlot() { 
    std::cout << "Called slot\n"; 
} 

... 

int main(int argc, char ** argv) { 
    QCoreApplication app(argc, argv); 

    MyQObj obj(&app); 
    QObject xxx(&app); 

    QList<QObject*> list; 
    list.push_back(&xxx); 
    obj.connectValueChanged(list, SLOT(mySlot())); 

    QTimer::singleShot(1000, [&xxx](){ 
      xxx.setObjectName("newname"); 
    }); 

    return app.exec(); 
} 

SIPファイルは、のようなものが考えられます。あなたはどのようなエラーを得るのですか

%Module A 

%Import QtCore/QtCoremod.sip 

class MyQObj : public QObject 
{ 
    public: 
     MyQObj(QObject * parent /TransferThis/ = nullptr); 

     void connectValueChanged(const QList<QObject*> &objects, const char* slot); 

    public slots: 
     void mySlot(); 
}; 
+0

ご返信ありがとうございます。私はこれを正しく構築できませんでした。私が 'sipコードで' using'行を残しておくとエラーが出ます( 'sip:usingは未定義です')。そして、私が 'VoidSlot'を取得した行を削除します。私は何かを逃していますか、あなたはあまりにもsipファイルをdratことができますか?乾杯。 –

+0

私はあなたにC++ 11へのアクセス権があると仮定しました。私は、 'using'ではなく' typedef'でその例を変更しました。 – Svalorzen

+0

返信いただきありがとうございます。私はC++ 11にアクセスできます。私の意図は、Qt5で新しい信号スロット接続を使用することです。したがって、私が保持したいメンバ引数へのポインタです。 –

関連する問題