簡體   English   中英

Slot(指向方法成員的指針)作為SIP中方法的參數

[英]Slot (pointer to method member) as argument to method in SIP

我有一個C ++類定義了一個方法,它有一個sol(指向成員方法的指針)作為參數:

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 );
   }
 }

無法按照SIP文件中的定義使用connectValueChanged ,我收到語法錯誤


我也嘗試使用const char *slot但沒有成功:在SIP文件中

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

我得到一個錯誤( no matching function for call to 'MyClass::connectValueChanged ),因為我想我需要一些MethodCode來實現這一點。


也許一些提示:


如何在SIP中定義一個槽作為參數的方法?

我認為這需要一些我目前無法編寫的MethodCode 我想使用Qt5新的信號/插槽連接(避免在cpp方法中使用const char *slot ,可能在python方法中放入一些MethodCode

我已經刪除了指向成員的指針,因為我不確定此刻是否支持此指針。 如果你使用const char* signal / slot方法,你還需要實現這樣的方法,否則你當然會得到一個不匹配的錯誤。

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();
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM