如何在Qt中创建处理程序

How to create a handler in Qt?

本文关键字:创建 处理 程序 Qt      更新时间:2023-10-16

我正在开发一个在C++中使用Qt 4.8版本的应用程序。

我需要使用一个 C 函数,它需要一个指向自由函数的指针:

void handler(int dummy)

我需要根据函数内部发生的情况更改 GUI 中显示的值。

所以我一直在阅读如何将成员函数转换为自由函数。我发现只有当我的成员函数是静态的时,我才能做到这一点。

但是我不能让它成为静态的 - 如果我把它变成静态的,我将无法更改任何小部件。

那么,我该如何处理这个问题呢?如何将非静态成员函数作为指向自由函数的指针传递。如果不可能,如何制定解决方法?

对于使用其他库的任何不同建议,我将不胜感激。

由于 C 函数接受参数,因此可以将该参数用作函子数组的索引:

class MyWidget : public QWidget {
  using vector_t = QVector<std::function<void()>>;
  static vector_t m_functions;
public:
  using function_type = void(*)(int);
  using size_type = vector_t::size_type;
  static function_type getHandler() {
    return +[](int index){ MyWidget::m_functions[index]; };
  }
  template <typename F> static size_type getIndexFor(F && fun) {
    m_functions.append(std::forward<F>(fun));
    return m_functions.size() - 1;
  }
  //...
  size_type getIndexForSetTitle();
};

getHandler返回处理程序函数的地址。getIndexFor返回要传递给处理程序以运行给定函子的参数。函子可以封装对小部件方法的调用。在这里,我们将在小部件上调用setWindowTitle

MyWidget::size_type MyWidget::getIndexForSetTitle() {
  static size_type index = getIndexFor([this]{ setWindowTitle("Foo"); });
  return index;
}
是的

,C++不允许将成员函数作为函数指针传递给 C 库。

在这种情况下,一种常见的方法是使用帮助程序函数,该函数的作用类似于 C 库和类实例之间的桥梁。此帮助程序函数是一个自由函数,它获取指向类的当前实例的指针,并在其主体中调用类实例的相应成员方法。

void handler_helper(int data){
    MyClass *obj = (MyClass *) data;
    obj->handler(); // This is the corresponding member method
}

在从该 C 库中调用函数时,应将 handler_helper 作为函数指针传递,(int) this作为其参数传递。