我正在尝试将库作为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
代码。
非常感谢您的帮助。
答案 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
语句放置的建议。在信号发出之前 建立连接至关重要,否则将丢失通知。