如何在Qt中的另一个类中发出信号?

9
我们可以通过像emit signal_a()这样的方式在定义信号的类中轻松地发出信号。
class A
{
signals:
    signal_a();

public:
    void fun()
    {
        do_something();
        emit signal_a();
        do_something();
    }
};

然而,如何在Qt的另一个类中发射信号?例如:

class B
{
public:
    void fun()
    {
        do_something();
        (*a) emit signal_a(); // ???
        do_something();
    }

A* a;
};
3个回答

11

你不能直接发射信号,因为信号是Qt4中的受保护方法。有几种方法可以实现你想要的效果:

  1. 在类A中创建一个公共方法来发射必要的信号
  2. 在类B中创建一个信号并将其连接到类A中的一个信号上

请记住,带有信号的类必须继承QObject并包含Q_OBJECT宏。


1
它也可以通过QMetaObject :: invokeMethod来实现。 - tx34
当然可以,但这会带来很大的开销。 - Dmitry Sazonov

10
在Qt5中,你可以直接这样做:
emit a->signal_a();

emit 是一个空的宏,而信号被设置为公共的(signals 关键字是一个变成 public 的宏)。


@ratchetfreak 为什么不呢? - khajvah
1
你能提供一个示例吗?如何从另一个类中发出信号?信号是受保护的方法。 - Dmitry Sazonov
@DmitrySazonov 根据这里,它们是公共的。 - khajvah
Signals are emitted by an object when its internal state has changed in some way that might be interesting to the object's client or owner. Signals are public access functions and can be emitted from anywhere, but we recommend to only emit them from the class that defines the signal and its subclasses. - khajvah
3
@khajvah 然后你需要补充说明它仅适用于Qt5,而不适用于Qt4。 - Dmitry Sazonov
显示剩余4条评论

4

Qt信号是普通的方法。'emit'关键字将扩展为空字符串,因此只需调用a.signal_a();即可。


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