我刚刚开始使用 Qt Quick 但遇到了一个问题。有一堂课
class CanHandler : public QObject
{
Q_OBJECT
Q_PROPERTY(QStringList plugins READ plugins NOTIFY pluginsChanged)
Q_PROPERTY(QStringList interfaceNames READ interfaceNames NOTIFY interfacesChanged)
Q_PROPERTY(QString selectedPlugin READ selectedPlugin WRITE setSelectedPlugin NOTIFY selectedPluginChanged)
public:
explicit CanHandler(QObject *parent = nullptr);
QStringList plugins() const { return m_plugins; }
QStringList interfaceNames() const { return m_interfaceNames; }
QString selectedPlugin() const { return m_selectedPlugin; }
signals:
void pluginsChanged();
void interfacesChanged();
void selectedPluginChanged();
public slots:
void setSelectedPlugin(const QString &pluginName)
{
if (pluginName == m_selectedPlugin)
return;
m_selectedPlugin = pluginName;
updateInterfaceNames();
emit selectedPluginChanged();
}
private:
QStringList m_plugins;
QList<QCanBusDeviceInfo> m_interfaces;
QStringList m_interfaceNames; // Store names for QML access
QString m_selectedPlugin;
void updateInterfaceNames() {
m_interfaceNames.clear();
if (!m_selectedPlugin.isEmpty()) {
m_interfaces = QCanBus::instance()->availableDevices(m_selectedPlugin);
for (const auto &info : m_interfaces) {
m_interfaceNames.append(info.name());
}
}
emit interfacesChanged();
}
};
有CanPluginComboBox.qml
ComboBox {
id: pluginComboBox
property var can: null
model: can ? can.plugins : []
Component.onCompleted: {
// Initialize currentIndex based on selectedPlugin
if (can && can.plugins.contains(can.selectedPlugin)) {
currentIndex = can.plugins.indexOf(can.selectedPlugin);
} else if (can && can.plugins.length > 0) {
currentIndex = 0;
}
}
onActivated: can.setSelectedPlugin(currentText)
Connections {
target: can
ignoreUnknownSignals: true
onSelectedPluginChanged: {
if (can && can.plugins.contains(can.selectedPlugin)) {
currentIndex = can.plugins.indexOf(can.selectedPlugin);
}
}
}
}
有 SettingsPageForm.ui.qml
Page {
width: 1024
height: 700
title: qsTr("Settings")
Label {
text: qsTr("You are on Page 2.")
anchors.centerIn: parent
}
CanPluginComboBox {
// Use the custom component
id: plugin_ComboBox
can: can0
width: 170
}
ComboBox {
id: comboBox_canInterface
x: 317
y: 65
width: 128
model: can0.interfaceNames
}
}
在 main.qml 中:
CanHandler {
id: can0
}
问题出在can.plugins.contains(can.selectedPlugin))
我收到的错误行中:
TypeError:对象 passthrucan、peakcan、socketcan、tinycan、virtualcan 的属性“contains”不是函数
console.log("can.plugins =", can.plugins)
输出一个数组
qml: can.plugins = [passthrucan,peakcan,socketcan,tinycan,virtualcan]
但数组检查失败
if (Array.isArray(can.plugins)) {
console.log("can.plugins is array")
} else {
console.error("can.plugins is not array!")
}