使用任何c ++函数作为Qt插槽

Rom*_*dgz 12 c++ qt signals-slots qwidget

有没有办法将任何C++函数用作Qt插槽,而不使其类继承自QWidget?

pne*_*zis 10

你不能在Qt版本<Qt 5.

为了使用信号/槽,必须调用元对象编译器.为了实现这一目标,您的课程应满足以下要求:

  • 继承自QObject或任何其他子类(例如QWidget,QPushButton等)
  • Q_OBJECT宏应在类的私有部分,以便使元对象的功能,如狭槽被限定
  • 使用Qt关键字slots,signals以便声明元编译器应将哪些函数作为插槽或信号处理

有关更多详细信息,请查看有关元对象系统以及信号和插槽的相应文档页面

另请查看QObject文档:

请注意,Q_OBJECT对于实现信号,插槽或属性的任何对象,宏都是必需的.您还需要在源文件上运行元对象编译器.我们强烈建议在QObject的所有子类中使用此宏,无论它们是否实际使用信号,插槽和属性,因为如果不这样做可能会导致某些函数出现奇怪的行为.

编辑:从Qt 5开始,functor和lambda表达式可以用作插槽.看到New Signal Slot Syntax in Qt 5


c_k*_*c_k 8

从Qt 5开始,functor和lambda表达式可以用作插槽(如前所述,这里:http://qt-project.org/wiki/New_Signal_Slot_Syntax).

由于我找不到示例代码,我添加了以下内容:

此示例boost::function用于ClassName::classMember()不带参数的类成员.

    boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance);
    connect(QObjectInstance, &QObject::signalName, f);
Run Code Online (Sandbox Code Playgroud)

当Qt信号和类成员具有参数(例如ClassName::classMember(int))时,boost函数应该如下调整:

    boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1);
Run Code Online (Sandbox Code Playgroud)

有关boost :: bind的更多信息,请参阅文档:http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html