如何将此信号连接到插槽

如何将此信号连接到插槽

问题描述:

我想在我的主类foo中创建一个信号,以便不同类中的静态方法可以发射它。我刚开始使用QT,所以我有点困惑。目前,我有以下代码如何将此信号连接到插槽

class Foo : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    Foo(QWidget *parent = 0, Qt::WFlags flags = 0); 
    ~Foo(); 
signals: 
    void UpdateSignal(int val); 
private slots: 
    void MySlot(int val); 
}; 

Foo::Foo(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags) 
{ 
    //How do I connect Bfoo::somemethod() here. I know its suppose to be like 
    connect(xx,SIGNAL(UpdateSignal(int)),this, SLOT(MySlot(int))); 
    ui.setupUi(this); 
} 

void Foo::MySlot(int val) 
{ 
//Do something.. 
} 

Now I have this class 

Class Bfoo 
{ 
    static void somemethod() 
    { 
     emit UpdateSignal(12); 
    } 
} 

在当你发出信号,它必须知道哪个对象发出它的静态somemethod()如何能发出UpdateSignal

任何建议。这是因为信号没有被实现为不同类别之间的消息,而是(可能不同)类别的实例之间的消息。其次,信号是受保护的方法。外部用户无法访问它们。你可以做的就是定义在Foo公共方法,该方法将做发射:

void Foo:EmitUpdateSignal(int x) { 
    emit UpdateSignal(x); 
} 

,然后在Bfoo::somemethod()你需要传递对象,它会发出信号:

void BFoo::somemethod(Foo &f) { 
    f.EmitUpdateSignal(12); 
} 

但是,请你是做。您发出在同一个实例中连接到插槽的信号。这表明设计存在缺陷,但如果没有更多关于你将要实现的细节的信息,我不能给出任何提示。

+0

谢谢,但这似乎是一个黑客。静态方法甚至允许呼叫信号? – Rajeshwar

+0

要发射物体,你需要它的实例。所以静态方法不能发出它的类成员的信号,因为没有对象。但它可以按照我向你展示的方式发出信号。 – Adrian