【问题标题】:How to send data through signal and slot?如何通过信号和槽发送数据?
【发布时间】:2014-02-19 23:02:37
【问题描述】:

有人可以帮助如何连接信号和插槽吗?

我有函数 1 接收实时数据(一个值)

void function1(int,double)
{
   if(condition)
     {
     //some code
     numb3 = 100;// double numb3 received new data
     emit mySignal(numb3);
     }
}

然后在其他函数中我有变量应该接收捕获的值

   void function2(int,double)
    {

     double parameter2 = numb3;
    }

我尝试过像

这样的组合
Q_SIGNAL double mySignal(double newValue=0){return newValue;};
Q_SLOT double slot1(double param=0) {emit mySignal(param); };

and then in function2{
connect(customPlot,SIGNAL(mySignal()), qApp, SLOT(slot1()));
double parameter2 = slot1();}

但它们没有按我的意愿工作。

提前致谢!

【问题讨论】:

标签: c++ qt


【解决方案1】:

在发出信号的类的标头中定义您的自定义信号:

signals:
       void   signalName(paramType1,paramType2...);

定义您的插槽以接收将接收信号的类中的信号:

public slots:
      void   slotName(paramType1,paramType2...) ; // Should be THE SAME parameter types

现在在您要开始连接两者的 cpp 内部进行连接:

connect(classObjectWhereTheSignalIs, SIGNAL(signalName(paramType1,paramType2)),classObjectWhereTheSlotIs,SLOT(slotName(paramType1,paramType2)));

现在你可以随时发出这样的信号:

emit (signalName(paramOfTypeParamType1, paramOfTypeParamType2...));

干杯。

【讨论】:

    【解决方案2】:

    你应该在标题中这样定义你的信号。

    Q_SIGNAL:
    
    void mySignal(int);
    

    您的插槽在头文件中将如下所示。

    Q_SLOT:
    
    void mySlot(int val);
    

    现在在 cpp 文件中,您可以将信号连接到插槽,如下所示。

    connect(signalObject, SIGNAL(mySignal(int)),slotObject,SLOT(mySlot(int)));
    

    【讨论】:

    • 好的,但是如何处理应该在信号和插槽之间发送的一个参数?
    • @gen_next 我写了一个更完整的答案。
    【解决方案3】:

    您正在混合 C++ 'return' 和 Qt 信号/插槽。通常,信号和槽的返回类型为 void。此外,信号的主体是由 MOC 生成的,因此您通常只需声明它即可。

    像这样:

    #include <QObject>
    #include <QDebug>
    
    class CustomPlot: QObject {
        Q_OBJECT
    
    public:
        void bla() {
            emit doSomething(3.1415926535);
        }
    
    signals:
        void doSomething(double value);
    };
    
    class EventHandler: QObject {
        Q_OBJECT
    
    public slots:
        void onDoSomething(double value) {
            qDebug() << "we are called with value =" << value;
        }
    
    };
    
    //in main:
    
    CustomPlot plot;
    EventHandler handler;
    
    QObject::connect(&plot, &CustomPlot::doSomething, &handler, &EventHandler::onDoSomething);
    
    plot.bla();  // in QtCreator's 'Application Output' panel you'll see:
                 //we are called with value = 3.1415926535
    

    【讨论】:

    • 嗨,谢谢,但在这个例子中,第一个函数 bla() 被启动,触发发出信号。我需要由发射函数触发的结果槽+槽结果必须同时分配给双对象....
    • 对不起,我没听懂你的意思。看起来你只有 5 秒的时间来表达一切:)。我不明白你为什么要阅读插槽的回报。插槽通常返回无效。如果没有,你将如何处理多个插槽连接到信号的情况?你会使用谁的返回值?
    • 再一次:当涉及到信号/槽时,返回值几乎总是无效的。当您想“返回”某个值时,您将该值传递给信号,即。 e.调用“发出信号名称(值到返回)”。因此,您可以将信号视为“反转”方法,其参数实际上是传递给连接插槽的返回值
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多