Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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,我试图将库作为Qt中的一个模块重用,因此,我希望对它进行尽可能少的修改/修补。目标是由类成员发出的Q_EMIT通知。我的示例代码如下所示: myclass.cpp public: MyClass::MyClass(QObject* parent) : QObject(parent) { this->manager = new QOfonoManager(this); } public slots: void MyClass::manager_available() { q

我试图将库作为Qt中的一个模块重用,因此,我希望对它进行尽可能少的修改/修补。目标是由类成员发出的
Q_EMIT
通知。我的示例代码如下所示:

myclass.cpp

public:
MyClass::MyClass(QObject* parent) : QObject(parent)
{
    this->manager = new QOfonoManager(this);
}

public slots:
void MyClass::manager_available()
{
    qDebug() << "Manager available";
    QStringList modems = this->manager->modems();
    qDebug() << "Modems:" << modems << "-" ;
}

public:
void MyClass::test()
{
    QStringList modems = this->manager->modems(); //Starts getting available modems

    connect (this->manager,SIGNAL(availableChanged()),this,SLOT(manager_available()));

}
void QOfonoManager::onGetModemsFinished(QDBusPendingCallWatcher* watcher)
{
    ......
    Q_EMIT availableChanged(true);

}


QOfonoManager::QOfonoManager(QObject *parent) :
    QObject(parent),
    d_ptr(new Private)
{
    .....
}
当我调用
MyClass::test
时,我希望成员类将
availableChanged
信号发送到
MyClass::available\u changed
。我在这里缺少什么,我可以使用
Q\u EMIT availableChanged(true)
而不必修改
QOfonoManager
代码吗


非常感谢您的帮助。

我认为根本问题在于您的
connect
语句与
QOfonoManager::availableChanged
的信号规范不匹配。信号通过
bool
参数发出

Q_EMIT availableChanged(true);
但是你的connect语句声明它是一个没有参数的信号

connect(this->manager, SIGNAL(availableChanged()), this, SLOT(manager_available()));
(您在控制台上没有收到错误消息吗?类似于
“QObject::connect:没有这样的信号…”
?)

将connect语句更改为以下内容应有助于解决此问题

connect(this->manager, SIGNAL(availableChanged(bool)), this, SLOT(manager_available()));
或者,如果您使用的是
Qt5
,则最好使用

connect(this->manager, &QOfonoManager::availableChanged, this, &MyClass::manager_available);

除上述内容外,您还应注意@scopchanov&@ixSci关于
connect
语句放置的建议。重要的是在发出信号之前建立连接,否则通知将丢失。

因此执行
onGetModemsFinished
方法中的代码,但看不到插槽中的输出?
QOfonoManager
不是我写的,但我希望它的
Q\u EMIT
通知我。因为这指示了调制解调器搜索完成的时间,所以我可以在该时间获取该信息。将
MyClass
的构造函数中的
connect
移动到
this->manager=new QOfonoManager(this)之后。我理解,但您可以确保调用
QOfonoManager
中的代码,只需使用调试器并进行检查。也有可能代码是在连接建立之前执行的,所以上面关于移动连接的建议是调查可能问题的一个良好开端。我将很快对此进行研究,感谢所有的帮助answers@scopchanov修正了。非常感谢@G.M.解决了我的问题。同样感谢斯科普切诺夫的建议,这也是值得注意的。