Qt中如何从外部调用一个信号?

How to externally call a signal in Qt?

我知道如何从信号所在的 class 内部调用信号:使用 emit。但是如果我想从父对象外部调用它呢?

我想要这样做的原因是因为给定的 QPushButton 连接到一个插槽,该插槽选择使用 sender() 调用它的按钮。现在我想要调用该插槽的相同功能,但不是在手动单击按钮之后,而是从代码本身内部调用。通常我只是以编程方式调用插槽,但由于 sender() 的使用,这种方式是无效的:直接调用插槽不会给它按钮的 ID。

那么我怎么能 "externally" 要求对象发出它的信号之一呢?也就是说,如何让我的 QPushButton 从代码中发出它的 clicked() 信号,而不是通过用鼠标单击按钮?

您不能直接从父对象发出信号。

Only the class that defines a signal and its subclasses can emit the signal. (http://qt-project.org/doc/qt-4.8/signalsandslots.html#signals)

您可以在发出信号的 QPushButton emitClicked() 中定义一个方法。然后你从代码中对你的 QPushButton 实例调用 emitClicked()

似乎 Qt Test 模块就是针对这种情况的。 查看有关模拟 GUI 事件的 this 教程。 基本上你使用 QTest::​mouseClick 并将指针传递给你的按钮。

Qt 头文件包含这一行(在 qobjectdefs.h 中):

#define emit

这意味着 emit 关键字的存在与否对代码没有影响,它只是为了让人们更清楚地看到您正在发射信号 reader。也就是说:

 emit clicked();

完全相同(就 C++ 编译器而言)
 clicked();

鉴于此,如果您希望按钮发出其 clicked() 信号,只需执行以下操作即可:

 myButton->clicked();

(尽管如果你想聪明一点,这同样有效):

 emit myButton->clicked();