私の目標は、(Windows)マシンで使用可能なシリアルポートをコンボボックスに入力することです。私はQSerialPortInfoのラッパーを作成しました。これはQMLルートコンテキストプロパティとして公開したいと思います。 QtQuick2アプリケーションテンプレートを出発点として使用しました。Qt5.7 QtQuick2アプリケーションテンプレートでQmlコンテキストプロパティを設定する
#include <QList>
#include <QObject>
class QuickSerialPortInformer : public QObject
{
Q_OBJECT
Q_PROPERTY(QList<QString> portselectionmodel READ portselectionmodel CONST)
public:
static const QuickSerialPortInformer *getInstance();
QList<QString> portselectionmodel() const;
protected:
QuickSerialPortInformer();
private:
static const QuickSerialPortInformer *Instance;
};
#endif // QUICKSERIALPORTINFORMER_H
私はこのようなオブジェクトを登録します。
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
/* here */ engine.rootContext()->setContextProperty("serialPortInformer", QuickSerialPortInformer::getInstance());
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
}
プロパティによって返さQList<QString>
は、コンボボックスのモデルを務めます。私の推測では、QList<QString>
は文字列のJavaScript array
に変換され、ComboBox
のモデルプロパティのC++部分に必要なものに変換されています。結局、プロパティはJavaScriptで定義された文字列の配列を受け入れます。しかし、QuickSerialPortInformer
のプロパティをComboBox
のに割り当てると、そのようなマーシャリングは行われないように思われる。コメントで指摘されているように、QtQuickビューのモデルとしては、一部のC++タイプしか使用できません。そのうちの1つは今私が使っているQStringList
です。
ComboBox {
id: portSelector
model: serialPortInformer.portselectionmodel
}
私の問題は、SerialPortInformer
がqmlコンテキストでは不明であるということです。オブジェクトを登録するために使用しているコンテキストが、engine.load()
で実行しているスクリプトには表示されていないと思われます。私はload()
とsetContextProperty()
の順序を逆にしようとしました。私は何が欠けていますか?
コメントとドキュメントに示唆されているように、SerialPortInformer
からserialPortInformer
に名前を変更した後、別の問題が発生します。 serialPortInformer
は、期待されるオブジェクトではなく、QMLの値true
のboolean
です。
私は、私のユースケースの動作を可能にした程度に "ブール値"ミステリーを解決することができました。答えは、SerialPortInformer::getInstance()
がconst
へのポインタを返していたことです。 const
- 修飾子serialPortInformer
はオブジェクトタイプであり、目的の属性が公開されました。私が最初にコンパイルした理由は、const QVariant &
のメソッドのオーバーロードが、explicit
コンストラクターを使用して代わりに呼び出されたという理由が考えられます。だから私のノートへの自己です:あなただけQStringList
を読みたいのではちょうどQ_INVOKABLEメソッドの戻り値の型としてQStringList
を行い、QMLコンテキスト
小文字の名前を使用するとどうなりますか? 'serialPortInformer'? – Mitch
私は前にこれが好きで、ただそれを再試行しました。まだ問題は残っています。 'serialPortInformer'がqmlデバッグウィンドウに表示されません。私はそれが 'mainWindow'と同じレベルになると期待します – everclear
私はあなたが関係なく、小文字の名前を使うべきだと思います。http://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#the- id属性は小文字でなければならないと言います。また、http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterSingletonTypeを使用してオブジェクトを登録することもできます。そうすれば、大文字の構文を使用してシングルトンとして扱うことができます。 – Mitch