3

我正在尝试制作一个在网络 CellId 更改时调用函数的 Qt 程序。

这是我的类声明(我没有显示一些超出问题范围的成员):

class Mgr:public QObject{
Q_OBJECT
public slots:
void onCidChange(int cell);
void NetworkStrengthChange(QSystemNetworkInfo::NetworkMode mode,int i);
public:QString mcc,mnc,cid,lac;
   QSystemNetworkInfo* networkInfo;
   Mgr();
};

在构造函数中:

networkInfo = new QSystemNetworkInfo();
mcc = networkInfo->currentMobileCountryCode();
qDebug()<<mcc; //I Get a proper debug output
mnc = networkInfo->currentMobileNetworkCode();
lac = QString::number(networkInfo->locationAreaCode());
cid = QString::number(networkInfo->cellId());
set("mccvar",mcc);  //set(QString,QString) is my own method to display information, and it works
set("mncvar",mnc);
set("lacvar",lac);
set("cidvar",cid);

在主函数中,

Mgr ob;
QObject::connect(ob.networkInfo, SIGNAL(cellIdChanged(int)), &ob, SLOT(onCidChange(int))); //The slot is never called even if cellid changes on device, but works on simulator
QObject::connect(ob.networkInfo, SIGNAL(networkSignalStrengthChanged(QSystemNetworkInfo::NetworkMode,int)),&ob,SLOT(NetworkStrengthChange(QSystemNetworkInfo::NetworkMode,int)));  //Works great

而且,我可以动态地看到 NetworkSignal,我的意思是如果信号是 60%,它会显示 60(通过我的 set() 方法),如果它是 90%,那么下一秒它会立即显示 90。这也适用于 Qt 模拟器和我的设备。(随着插槽定义更新显示网络强度变化的值)

但是当谈到 cellid 时,cellid 会在对象被构建时显示并且它会永远保留在那里,即使我将手机移动到具有不同 cellid 的不同位置(由另一个应用程序验证),它仍然是在对象构造。但这在 Qt 模拟器中运行良好,如果我更改 cellid,则会调用插槽。我还尝试在插槽定义中再次设置新的 cellid 值,例如 set("cidvar",newcidvalue),我认为这是必要的。但是该插槽永远不会在设备中被调用,但它可以在 Qt 模拟器中工作,如前所述。那么有人可以帮我在哪里出错,或者用其他方法来检测细胞的变化吗?

最后一件事,因为课程涉及 Q_OBJECT,我已经开始学习了

4

0 回答 0