首页 > 解决方案 > 无法使用 QVariantList 填充 ComboBox 模型

问题描述

来自 QML: AudioInfoCpp是 C++ 类的对象。旨在从 C++ 中获取数据并将其填充到组合框的模型中。

property ListModel comboModel: cbItems
AudioInfoCpp
{
    id: audioInfoCpp
    Component.onCompleted:
    {
        fetchInputDevices()
        comboModel.append(inputDevices1)

        console.log(inputDevices1)
    }
}

ComboBox
{
    id: comboBoxM;
    width: 100
    model: audioInfoCpp.inputDevices1;
    textRole: "langDescription";
}

从.h

#ifndef AUDIOINFO_H
#define AUDIOINFO_H

#include <QAudioDeviceInfo>
#include <QList>
#include <QVariantList>

class AudioInfo : public QObject
{
    Q_OBJECT

protected:
    QAudioDeviceInfo objQAudioDeviceInfo;

public:
    AudioInfo();

    Q_PROPERTY(QVariantList inputDevices1 READ inputDevices1 WRITE setInputDevices1 NOTIFY inputDevices1Changed)


    Q_INVOKABLE void fetchInputDevices();

    QVariantList inputDevices1() const
    {
        return m_inputDevices1;
    }

public slots:
    void setInputDevices1(QVariantList inputDevices1)
    {
        if (m_inputDevices1 == inputDevices1)
            return;

        m_inputDevices1 = inputDevices1;
        emit inputDevices1Changed(m_inputDevices1);
    }

signals:
    void inputDevices1Changed(QVariantList inputDevices1);

private:
    QVariantList m_inputDevices1;
};

#endif // AUDIOINFO_H

.cpp:

void AudioInfo::fetchInputDevices()
{
    QList<QAudioDeviceInfo> devices1 = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
    if (devices1.empty())
    {
        qDebug() << "No audio input devices";
    }

    QVariantList tt;

    for (const QAudioDeviceInfo& device : devices1)
    {
        tt.append(device.deviceName());
    }

    setInputDevices1( tt );
}

在 QML 和 CPP 中,我可以看到从列表中打印的数据,但我无法填充组合框。没有错误。

请指导。

标签: c++qtqml

解决方案


问题来自这一行:

textRole: "langDescription"

这意味着它将查看模型中的每个元素以查找该langDescription字段。但是你正在用 QStrings 填充你的 QVariantList:

    QVariantList tt;

    for (const QAudioDeviceInfo& device : devices1)
    {
        tt.append(device.deviceName());
    }

QStrings 没有langDescription字段,因此不会显示任何内容。

要解决此问题,请尝试完全删除该textRole行并让 QML 自动找出如何正确显示名称。


推荐阅读