向 QML 公开C++中的串行端口名称



我正在尝试通过Q_INVOKABLE QStringList availablePorts()函数公开QSerialPort.available((来自我在main类中直接公开给QML的类。

主要:

qmlRegisterType<SerialPortManager>("com.MyApp.qml", 1, 0, "SerialPortManager");

串行端口管理器

class SerialPortManager : public QObject
{
    Q_OBJECT
public slots:
    Q_INVOKABLE virtual QStringList availablePorts() {
        QList<QSerialPortInfo> portsAvailable = QSerialPortInfo::availablePorts();
        QStringList names_PortsAvailable;
        for(QSerialPortInfo portInfo : portsAvailable) {
            names_PortsAvailable.append(portInfo.portName());
        }
        return names_PortsAvailable;
    }

这对于 QML 中的model类型无效,因为它会引发Unable to assign QStringList to QQmlListModel*错误。

QML

ComboBox {
    model: serial.availablePorts()
}
SerialPortManager {
    id: serial
}

那么我该如何解决这个问题呢?

一种解决方案是按照文档的建议返回QVariant,为此我们使用QVariant::fromValue()

#ifndef SERIALPORTMANAGER_H
#define SERIALPORTMANAGER_H
#include <QObject>
#include <QSerialPortInfo>
#include <QVariant>
class SerialPortManager : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE static QVariant availablePorts() {
        QList<QSerialPortInfo> portsAvailable = QSerialPortInfo::availablePorts();
        QStringList names_PortsAvailable;
        for(const QSerialPortInfo& portInfo : portsAvailable) {
            names_PortsAvailable<<portInfo.portName();
        }
        return QVariant::fromValue(names_PortsAvailable);
    }
};
#endif // SERIALPORTMANAGER_H

相关内容

  • 没有找到相关文章

最新更新