没有 QObject 或 slots 的 Qt connect()

5
我知道我想要实现的是可能的,因为我可以用lambda表达式做到这一点,而且以前也做过(几个月前,我只是不记得语法了)。基本上,我想将一个函数连接到定时器/按钮等来方便事件的处理。
以下是我的工作代码:
connect( &renderTimer, &QTimer::timeout, [ = ]() {
        onTimerUpdate();
    } );

使用lambda表达式连接到槽函数,我想直接引用函数本身而不是使用lambda表达式。我尝试了插入方法onTimerUpdate()&onTimerUpdate,但都不起作用。我不想使用QObject或它预先生成的垃圾,也不想在我的类中定义槽函数。简单来说,我想直接将其连接到我的函数。

2个回答

15

连接到成员函数时的格式如下:

QObject::connect(&renderTimer, &QTimer::timeout, this, &ArclightGLWidget::onTimerUpdate); 

连接免费函数时的格式(lambda同样适用)

QObject::connect(&renderTimer, &QTimer::timeout, onTimerUpdate); 

这是连接到静态成员函数的格式:

QObject::connect(&renderTimer, &QTimer::timeout, SomeType::onTimerUpdate); 

@Krythic 我假设它是一个自由函数,看看我的编辑。 - dtech
1
您是否也会更新您的答案,显示自由函数声明以帮助未来的某个人?我将在2分钟内接受您的答案(需要等待)。 - Krythic

1
假设此调用是在包含 onTimerUpdate 方法的类内部进行的。如果是这样,您可以调用:
connect(&renderTimer, &QTimer::timeout, this, &foo::onTimerUpdate); 

这比使用lambda更好,因为Qt会管理连接,并且您还可以在slot中调用sender()
但是,如果您在其中onTimerUpdate是一个方法的类中,您也可以像问题中所述那样使用lambda。
connect( &renderTimer, &QTimer::timeout, [=](){onTimerUpdate();} );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接