Qt由类成员发出的信号通知

时间:2018-09-27 13:20:19

标签: 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()
{
    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()));

}

qofonomanager.cpp

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

}


QOfonoManager::QOfonoManager(QObject *parent) :
    QObject(parent),
    d_ptr(new Private)
{
    .....
}

当我调用MyClass::test时,我希望成员类向availableChanged发信号通知MyClass::available_changed。我在这里缺少什么,可以使用Q_EMIT availableChanged(true)而不用修改QOfonoManager代码。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

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

Q_EMIT availableChanged(true);

但是您的connect语句声明它是一个没有参数的信号...

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

(在控制台上没有收到错误消息吗?类似"QObject::connect: No such signal ..."的内容吗?)

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

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

或者,如果您使用的是Qt5,最好使用new signal/slot syntax ...

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

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