- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个 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/
Qt Quick Templates 弹出窗口与 QtQuick Controls 弹出窗口有什么区别? 我从 import QtQuick.Templates 2.0 与 import QtQuic
Qt Quick Templates 弹出窗口与 QtQuick Controls 弹出窗口有什么区别? 我从 import QtQuick.Templates 2.0 与 import QtQuic
当编写不使用 QML 且不依赖于新的 Qt 5 功能的 Qt 应用程序时,我们可以同时使用 Qt 4 和 Qt 5 对其进行编译(除了少数源代码不兼容)。 当我们想要使用 Qt 5 功能但又想退回到等
如何使用 QtQuick 2 绘制矩形并控制它是否显示左边框或右边框或两者? 最佳答案 Rectangle 中有一个 border 属性,允许您向元素添加边框。问题是你不能只显示左边框或右边框。为此,
我一直在寻找如何使我的QtQuick 2.0应用程序的背景透明。我发现的大多数答案都使用 QtDeclarative,这适用于 QtQuick 1.0,但不适用于版本 2。 最后我找到了一个答案,我将
经过几周的断断续续的研究,我仍然没有找到关于如何在 QtQuick 中执行翻译/本地化的全面指南(例如,使用 QML 语言,而不是 C++ 或 Python)。 一般来说,我问的是在 QtQuick
我需要在我的 QtQuick2 应用程序中支持具有相同分辨率的多屏幕。换句话说,当我感觉到辅助屏幕已连接时,我需要扩展我的应用程序。在 QtQuick2 中有可能吗? 最佳答案 我一直在使用 QtQu
我编写了一个 C++ 方法来查找所有串行端口,打开、写入和关闭并使用 Q_INVOKABLE 从 QML 调用此方法。在 QML 中,我首先将 LoadingPage.qml 推送到 StackVie
我有 Qt GUI 应用程序。主窗口包含使用窗口容器放置在其上的 QtQuick 组件: QQuickView * view = new QQuickView (); QWidget * contai
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
背景故事 所以我最近决定尝试使用 Qt。我开始制作 QtQuick 应用程序。在我的设计器 View 中,我有一个按钮和一个鼠标区域。 我想做什么: 当我单击按钮时,我想显示一个带有一些文本的消息框(
当调整 GridView 的大小时,它的元素被重新排列,该元素的动画似乎不起作用。 在这里你可以找到一个简单的例子:http://pastebin.com/BgST6sCv 如果单击示例中的其中一个方
我们正在尝试在 Visual Studio 2015 中运行 OpenVR 模拟器(链接 https://github.com/matzman666/OpenVR-InputEmulator)。构建成
我正在尝试缩放 QQuickPaintedItem,这样事情就会变大,但绘图质量不会变差(即随着项目变大重新触发绘画)。 setScale 方法和我想得到的类似,但是项目内容没有缩放,所以看起来很糟糕
在 Qt/C++ 中有 QT_DEBUG 定义宏来知道它何时在调试或发布时编译。 有什么方法可以知道应用程序是否在 QML 文件中以调试或 Release模式运行? 最佳答案 您可以使用 contex
尝试将 QtQuick.Dialogs 1.(0/1/2) 添加到我的项目时出现以下错误: qrc:/qml/main.qml:4 module "QtQuick.Dialogs" is not in
这个问题其实来自How to scroll to certain row in QML TreeView . QtQuick 项的一些属性是隐藏的,例如 TreeView 中的 __listView。
我想使用 QML 创建一个类似的 UI,如下面的链接所示,这是我在 pyqt5 中使用 Qcompleter 的问题, pyqt5 autocomplete QLineEdit - Google pl
我正在尝试编写一个 QtQuick 程序,它作为用户和一些 CLI 应用程序之间的智能接口(interface)。我已经实现了 QtQuick + JavaScript 应用程序。 QtQuick 按
这个问题在这里已经有了答案: How do I apply the style to a TextField in QML? It seems "style" attribute isn't ava
我是一名优秀的程序员,十分优秀!