2017-10-30 18 views
2

私はAndroid用のQTクイックコントロール2アプリケーションと、デバイスとの通信にQt Bluetoothを使用しています。 ボタンをクリックすると(onClicked()信号を使用)、アプリケーションはBluetooth通信のためのC++クラスの関数を呼び出します。コマンドをデバイスに送信し、応答を待ちます。これまでのところうまくいきます。QT qmlボタンは、無効になっているにもかかわらずクリックされた信号を送信します。

今私の問題: クリックしたとき、私は、答えを待っている間に複数のクリックを防ぐために、もう一度ボタンを有効にする、Bluetooth機能を呼び出して、ボタンを無効にするが、そのが待っている間しかし、ボタンがonClicked()信号を発しますenabledプロパティはfalseです。

Bluetoothダイアログが終了したらボタンを有効にしないと、(期待どおり)一度しかクリックすることはできませんが、再度有効にします。

信号が複数回放射されると、ハードウェアバックエンドに関連する問題が発生します。

これを修正する方法はありますか?

onClickedボタン()シグナル:

bEdit.onClicked: { 
     bEdit.enabled = false; 
     btConnect.fill("1", "30"); 
     bEdit.enabled = true; 
} 

Bluetoothの書き込みと読み込み:

unsigned int Bluetooth::fill(QString slot, QString volume) 
{ 
    QString output = ("CK Fill " + slot + " " + volume + "\r\n"); 
    QByteArray baOutput = output.toLatin1(); 
    static const QString serviceUuid(QStringLiteral("00001101-0000-1000-8000-00805F9B34FB")); 
    socket->connectToService(QBluetoothAddress("98:d3:32:20:46:b9"), QBluetoothUuid(serviceUuid), QIODevice::ReadWrite); 
    socket->write(baOutput); 
    QString input = ""; 
    while(input == "") 
    { 
     input = socket->readAll(); 
    } 
    qDebug() << input; 
    return 0; 
} 
+0

コードをお知らせください。ブルートゥース機能がブロックされていない可能性が高く、すぐに戻る。 – derM

+0

不可能:https://stackoverflow.com/a/46767460/5068056 – aghilpro

+0

@aghilpro可能性があります、私はデバッガで私のコードを通過しました。 –

答えて

0

を私は、Bluetooth上で動作していませんが、QTとRESTのAPIの上で作業している間、私は同じような状況に遭遇していましたQML。ボタンの可視性プロパティを変更した後にqtイベントループが呼び出されないため、ボタンのクリック信号が無効になりません。あなたは信号/スロットを使用して、以下の作業を試すことができます。

ApplicationWindow { 
    id:"root" 
    signal activated() 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 
    Button{ 
     id: "button" 
     text : "Button" 
     visible : true 
     enabled : true 
     onClicked: { 
      button.enabled=false; 
      root.activated() 
     } 
    } 
    onActivated:{ 
     btConnect.fill("1", "30"); 
     button.enabled=true; 
    } 
} 

ここでボタンを無効にしてから信号を送信します。このシグナルのスロットでは、作業可能ボタンをもう一度押すと、バックエンド作業を行うことができます。 これが役立つことを願っています。

+0

カプセル化以上のものですか? –

1

クリックすると無効になります。しかし、外部からボタンを有効にしてください。

Button { 
    id: myButton 
    onClicked: { 
     enable = false 
     worker.doAction() 
    } 
} 

Worker { 
    id: worker 
    onDoAction: { 
     // do something 
     button.enable = true 
    } 
} 

BTW:アイテムのIDをqoutesで囲む必要はありません。

関連する問題