ネットワーク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シミュレーターではうまく機能します。セルIDを変更すると、スロットが呼び出されます。また、スロット定義内にset( "cidvar"、newcidvalue)のような新しいcellid値を再度設定しようとしましたが、これは必要だと思います。ただし、スロットがデバイスで呼び出されることはありませんが、前述のようにQtシミュレーターで機能します。それで、誰かが私が間違っているところ、またはcellidの変化を検出するための代替方法を手伝ってくれるでしょうか?
最後に、クラスにはQ_OBJECTが含まれているため、すでにモックを作成しています。