【问题标题】:Slot (pointer to method member) as argument to method in SIP插槽(指向方法成员的指针)作为 SIP 中方法的参数
【发布时间】:2017-08-30 15:26:53
【问题描述】:

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

【问题讨论】:

  • 你得到什么错误?你怎么打电话给connectValueChanged
  • 我刚刚用错误更新了问题。
  • 你能显示你调用函数的实际代码吗?
  • 您可能以错误的方式调用该函数,请查看我的示例并展示您的不同之处。

标签: c++ pyqt qt5 signals-slots python-sip


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。我无法正确构建它。如果我在 sip 代码中保留 using 行,我会收到一个错误 (sip: using is undefined),如果我删除该行,我会收到 unknown VoidSlot。我错过了什么吗,你能不能把 sip 文件也删掉?干杯。
  • 我假设您可以访问 c++11,我已将示例更改为 typedef 而不是 using
  • 再次感谢您的回复。我确实可以访问 c++11。我的意图是在 Qt5 中使用新的信号槽连接,因此我想保留指向成员参数的指针。
  • 我只是想知道是否无法使用某些方法代码将const char *slot 转换为指向方法成员的指针。干杯。
  • @DenisRouzaud 我想sip 不支持指向成员的指针。理想情况下,您可以导出const char* 版本并使用它来调用指向成员方法的指针。您可以将 const char* 转换为指针成员,并适当初始化 static const QHash&lt;QString, void (MyQObj::*)()&gt;
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多