我正在开发适用于Android的QT Quick Controls 2应用程序,并使用Qt Bluetooth与设备进行通信。
通过单击按钮(使用onClicked()
信号),应用程序调用我的c ++类的功能进行蓝牙通信。它将命令发送到设备并等待答复。到目前为止它运作良好。
现在我的问题:
单击时禁用按钮,调用蓝牙功能,然后再次启用按钮,以防止在等待答案时多次单击,但是,虽然启用了属性为false,但按钮会在等待时发出onClicked()
信号。
当蓝牙对话框完成后我没有启用按钮时,它只能被点击一次(如预期的那样),但我希望它再次启用。
信号的多次发射会在硬件后端引起相关问题。
知道怎么解决这个问题吗?
按钮onClicked()信号:
bEdit.onClicked: {
bEdit.enabled = false;
btConnect.fill("1", "30");
bEdit.enabled = true;
}
蓝牙写入和读取:
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 :(得分:2)
我还没有使用蓝牙技术,但在使用QT QML进行REST api时,我遇到了同样的情况。您的按钮单击信号未禁用,因为在更改按钮的可见性属性后未调用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;
}
}
这里我们禁用按钮然后发出信号。在再次完成工作启用按钮后,您可以在此信号的插槽中执行后端工作。 希望这会有所帮助。
答案 1 :(得分:1)
单击时禁用按钮。但是从外面启用按钮。
Button {
id: myButton
onClicked: {
enable = false
worker.doAction()
}
}
Worker {
id: worker
onDoAction: {
// do something
button.enable = true
}
}
BTW:没有必要用qoutes包围项目的id。