gpt4 book ai didi

c++ - QtQuick 动画卡住列表和打开串口

转载 作者:行者123 更新时间:2023-11-27 23:08:05 26 4
gpt4 key购买 nike

我编写了一个 C++ 方法来查找所有串行端口,打开、写入和关闭并使用 Q_INVOKABLE 从 QML 调用此方法。在 QML 中,我首先将 LoadingPage.qml 推送到 StackView,然后在 onClicked: Button 插槽内调用 find() Serial Ports。

问题:如果连接了很多串行端口,将 LoadingPage.qml 推送到 StackView 时会卡住,动画开始然后立即卡住,当函数查找完成时动画再次开始。 [串口.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;
}

最佳答案

您的代码在 GUI 线程中运行,由于它阻塞了 GUI 线程,因此用户交互也会停止。

您需要在单独的线程中执行扫描。 Qt Concurrent 框架非常适合这一点,因为您正在执行一个可以在任何线程中完成的独立操作。您的 find() 方法可以变成独立函数或静态方法(因为它确实是这样)。您还可以在 lambda 中捕获 this

然后您将按如下方式运行它:

class Physical {
QFuture<QStringList> m_future;
QFutureWatcher<QStringList> m_futureWatcher;
// A string list is a simpler type to type :)
static QStringList doFindPorts() {
...
}
Q_SLOT void findPortsFinished() {
QStringList ports(m_future);
// use the list of ports
}

public:
Physical() {
connect(&m_futureWatcher, SIGNAL(finished()), SLOT(findPortsFinished()));
...
}
Q_SLOT void findPorts() {
if (m_future.isRunning()) return;
m_future = QtConcurrent::run(doFindPorts);
m_futureWatcher.setFuture(m_future);
}
};

关于c++ - QtQuick 动画卡住列表和打开串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21911526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com