Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为qt内的信号和插槽使用另一个类对象_C++_Qt - Fatal编程技术网

C++ 为qt内的信号和插槽使用另一个类对象

C++ 为qt内的信号和插槽使用另一个类对象,c++,qt,C++,Qt,考虑以下场景: 我在C++应用程序中集成了Qt。我希望从GUI而不是终端输入数据。为此,我为QT创建了一个函数。我的对话框窗口由三行文本和一个按钮组成,单击该按钮我想调用其他类的特定方法。我的信号和插槽有问题 考虑以下文件: main.cpp has a.h -> a.cpp a.cpp has a.h myslots.h a.cpp中的QT-app方法为: int A::inputData(){ ... A a myslots ms; QObject::connect(butto

考虑以下场景:

<>我在C++应用程序中集成了Qt。我希望从GUI而不是终端输入数据。为此,我为QT创建了一个函数。我的对话框窗口由三行文本和一个按钮组成,单击该按钮我想调用其他类的特定方法。我的信号和插槽有问题

考虑以下文件:

main.cpp has 
a.h -> a.cpp

a.cpp has 
a.h
myslots.h
a.cpp中的QT-app方法为:

int A::inputData(){
...
A a
myslots ms;
QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
....
}
myslots.h有:

a.h and inherited from A as:
class myslots : public QObject, public A {
Q_OBJECT
public slots:
    void clickButton(A &a);
signals:
    void buttonClicked();
};
myslots.cpp有:

myslots.h and the following method
void myslots::clickButton(A &a) {
        cout <<"I am called successfully"<<endl;
        a.perform_action(-2.3, 4.5, 4.4);
        emit this->buttonClicked();
}
实际上,我想通过单击按钮将三个文本行中的三个双值传递给函数,即:1.3、2.4、4.5,其中要调用的函数位于myslot.h继承的另一个类中,并接受三个参数

目前我正在测试我是否能够正确调用该函数,但我没有

谢谢

一些问题:

1-当您从QObject派生时,始终将Q_OBJECT宏放在类的私有部分,执行如下操作

class MyClass: public QObject {
    Q_OBJECT
public:
   ...
此Q_对象宏对于具有信号和插槽的类很重要

2-在connect语句中,您必须告诉Qt参数的类型,而不是您使用的名称,也就是说,如果插槽函数是

void myslots::clickButton(A &a);
您连接到它的

connect(emiterObject, SIGNAL(someSignal(A)), targetObject, SLOT(clickButton(A)));
一些问题:

1-当您从QObject派生时,始终将Q_OBJECT宏放在类的私有部分,执行如下操作

class MyClass: public QObject {
    Q_OBJECT
public:
   ...
此Q_对象宏对于具有信号和插槽的类很重要

2-在connect语句中,您必须告诉Qt参数的类型,而不是您使用的名称,也就是说,如果插槽函数是

void myslots::clickButton(A &a);
您连接到它的

connect(emiterObject, SIGNAL(someSignal(A)), targetObject, SLOT(clickButton(A)));

这是行不通的。在信号中插槽必须是类型,而不是对象或其引用。我是说这个

QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
一定是

QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(A)));

但是,您必须捕获另一个错误-信号中的A在哪里?为什么在信号中使用A?

这不起作用。在信号中插槽必须是类型,而不是对象或其引用。我是说这个

QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
一定是

QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(A)));

但是,您必须捕获另一个错误-信号中的A在哪里?为什么在信号中使用A?

因为Qt 5.x,所以可以使用lambda表达式作为插槽

因此,您的connect语句应该如下所示:

QObject::connect(button, &QPushButton::clicked, [a, ms](){ms.clickButton(&a);});

但是,正如Karsten Koop所说,使用
a
ms
作为局部变量并不是一件好事。

因为Qt 5.x可以使用lambda表达式作为插槽

因此,您的connect语句应该如下所示:

QObject::connect(button, &QPushButton::clicked, [a, ms](){ms.clickButton(&a);});
但是,正如Karsten Koop所说,使用
a
ms
作为局部变量并不是一件好事。

错误在于:

QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
它必须是:

QObject::connect(button, SIGNAL(clicked(A)), &ms, SLOT(clickButton(A)));
您在信号中发送的类型必须在接收该类型的插槽中。

错误在您的:

QObject::connect(button, SIGNAL(clicked()), &ms, SLOT(clickButton(&a)));
它必须是:

QObject::connect(button, SIGNAL(clicked(A)), &ms, SLOT(clickButton(A)));

您在信号中发送的类型必须在接收该类型的插槽中。

您的类中有
Q\u对象
宏吗?是的,我在myslot中有。HY您不能在
connect
语句中传递参数。您只能在发出信号时执行此操作:
emit mySignal(&a)
。是否要将局部变量
a
作为参数传递给插槽?这无法工作,因为调用插槽时局部变量不再存在。您可以做的是将单击的
信号连接到类
a
中的一个插槽,并从该插槽发出一个新信号,包括
作为参数。您的类中是否有
Q\u对象
宏?是的,我在myslot中有。您无法在
connect
语句中传递参数。您只能在发出信号时执行此操作:
emit mySignal(&a)
。是否要将局部变量
a
作为参数传递给插槽?这无法工作,因为调用插槽时局部变量不再存在。您可以做的是将单击的
信号连接到类
a
中的插槽,并从此插槽发出新信号,包括
作为参数。注意:在信号中传递对局部变量的引用是一件坏事。注意:在信号中传递对局部变量的引用是一件坏事。