【发布时间】:2014-02-20 15:00:35
【问题描述】:
我编写了一个 C++ 方法来查找所有串行端口、打开、写入和关闭,并使用 Q_INVOKABLE 从 QML 调用此方法。在 QML,我首先将 LoadingPage.qml 推送到 StackView,然后在 onClicked: Button 插槽内调用 find() 串行端口。
问题:如果连接了多个串口,将LoadingPage.qml推送到StackView时会冻结,动画开始然后立即冻结,当函数find完成动画重新开始时。 [SerialPort.qml] 如何更好地解决这个问题?
//SerialPort.qml
Button {
text: qsTr("start")
onClicked: {
stackView.push(Qt.resolvedUrl("LoadingPage.qml"))
module.find()
}
}
QVector<QString> Physical::find()
{
m_ports.clear();
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
bool hasError = false;
QSerialPort port;
port.setPort(info);
if (port.open(QIODevice::ReadWrite)) {
if (!hasError && !port.setBaudRate(serial::baudRate)) {
emit error(tr("Can't set baud to %1, error %2")
.arg(port.portName())
.arg(port.error()));
hasError |= true;
}
if (!hasError && !port.setDataBits(serial::dataBits)) {
emit error(tr("Can't set data bits to %1, error %2")
.arg(port.portName())
.arg(port.error()));
hasError |= true;
}
if (!hasError && !port.setParity(serial::parity)) {
emit error(tr("Can't set parity to %1, error %2")
.arg(port.portName())
.arg(port.error()));
hasError |= true;
}
if (!hasError && !port.setStopBits(serial::stopBits)) {
emit error(tr("Can't set stop bits to %1, error %2")
.arg(port.portName())
.arg(port.error()));
hasError |= true;
}
if (!hasError && !port.setFlowControl(serial::flowCtrl)) {
emit error(tr("Can't set flow control to %1, error %2")
.arg(port.portName())
.arg(port.error()));
hasError |= true;
}
if (!hasError) {
m_ports.append(port.portName());
}
QByteArray data;
data.resize(1);
data[0] = ID_READ;
port.write(data);
port.close();
}
}
return m_ports;
}
【问题讨论】:
-
我明白你为什么要测试每个端口是否支持你请求的参数;但我不明白为什么你向每个端口发送一些数据并且这样做之后不测试任何东西(你已经将端口存储在你的内部列表中......)。您想通过测试行为来扫描某种类型的设备吗?
标签: c++ qt qml qt-quick qtquick2