如何在Qt中创建处理程序
How to create a handler in Qt?
我正在开发一个在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
作为其参数传递。
相关文章:
- "动态创建的事件处理程序"复选框
- 处理无法按预期方式创建的对象,c++
- 处理C++线程的创建/重用
- 创建一个函数,如果元素在unordered_set中,则返回 true,如何处理模板
- 如何在 c++ linux 中创建事件处理程序
- 如何在winApi上正确创建按钮以及处理其消息
- 在 C++ 中创建自己的错误处理机制
- 指纹读取器 - 从 C# 代码创建事件处理程序到C++的问题
- 如何创建可变参数模板函数来移动参数值并处理左值和右值
- 如何管理和处理仅在堆上创建的类的对象
- (C )正在创建专门用于处理所有其他自定义对象的类/对象一种处理项目的正确方法
- 在 boost::d eadline_timer 上创建包装器,无法将参数传递给处理程序函数
- 共享指针矢量的自动创建和处理
- 用管道在C++中创建调度队列/线程处理程序:FIFO溢出
- 创建多个线程以处理多个请求是一个好练习吗?
- 是否可以对构造函数抛出异常的对象进行异常处理,该对象的异常处理接近其基于堆栈的代码创建
- 创建、处理和在窗口QTCreator之间切换
- 如何在Qt中创建处理程序
- 用c++创建处理RTL语言和复杂脚本的pdf
- 用Bind创建处理程序函数来处理单击的菜单项- wxWidgets 3.0