1

我有一个 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 );
   }
 }

connectValueChanged不能按照 SIP 文件中的定义使用,我收到语法错误


我也尝试使用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 新的信号/插槽连接(避免const char *slot在 cpp 方法中使用,可能在 python 方法中使用 some MethodCode

4

1 回答 1

0

我已经删除了指向成员的指针,因为我不确定目前是否支持它。如果你使用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();
};
于 2017-04-06T15:41:08.257 回答