質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1621閲覧

QtでのJavaScriptの実行について

kokawa2003

総合スコア217

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/07/29 11:25

Qtでjavascriptを実行したいと思い下記のコードを書きました。

lang

1 QScriptEngine engine; 2 QScriptValue global = engine.globalObject(); 3 engine.evaluate("function cubeaaa(x) { return x * x * x; }"); 4 QScriptValue cube = global.property("cubeaaa"); 5 QScriptValueList args; 6 args << 3; 7 QScriptValue v=cube.call(QScriptValue(), args); 8 qDebug() << v.toNumber(); // 27 9

これは正しく実行され27が帰るのを確認しました。そこでJavascriptを改造して
console.log(x);を追記しました。

lang

1 QScriptEngine engine; 2 QScriptValue global = engine.globalObject(); 3 engine.evaluate("function cubeaaa(x) { console.log(x); return x * x * x; }"); 4 QScriptValue cube = global.property("cubeaaa"); 5 QScriptValueList args; 6 args << 3; 7 QScriptValue v=cube.call(QScriptValue(), args); 8 qDebug() << v.toNumber(); // 27 9

これは戻り値nanとなります。
どうもqtのjavascriptにはconsoleがないみたいです。
この状態でデバッグする(Javascript側で出力する)にはどうすればいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。既に自己解決されておりますが、自分が勝手に親近感を抱きましたので、蛇足すぎる情報を投稿させていただきます。

フリーソフトウェアのDJソフト「Mixxx」でのQtScriptの使用例

MixxxではXMLとJavaScriptによるMIDIコントローラーでのソフト制御とMIDIコントローラーのLEDなどの制御を記述することができます。

Controller Mapping Documentation - Mixxx Wiki
Controller Scripting - Mixxx Wiki

余談: Mixxx Wikiの一部日本語訳について

「Controller Scripting」に関しては、5年前くらいに私が日本語訳したものありますが、Mixxx自身のバージョンアップにより、最新版の原本Wikiドキュメントの翻訳はもちろん、MixxxがQt5に移行したことによって新たな情報がありそうですので、日本語訳は2020-03-16時点では参考にしない方が良いと思います。


実際にJavaScriptファイルをどのように読んでいるかは、GitHubで公開されているソースコードではこの辺かなと思います。

src/controllers/controllerengine.h
src/controllers/controllerengine.cpp

QMLがほぼJavaScriptに見える件

既にご承知かとは存じ上げますが、公式ドキュメントを張り付けておきます。
QML Applications - Qt Documentation

上記リンク先の内容を引用すると、

QML is a user interface specification and programming language. It allows developers and designers alike to create highly performant, fluidly animated and visually appealing applications. QML offers a highly readable, declarative, JSON-like syntax with support for imperative JavaScript expressions combined with dynamic property bindings.

JSON-like syntax との事なので、そりゃあ似るかなというのが個人的な感想です。

少し深入りして First Steps with QML - Qt Documentationを少し眺めました。

個人の感想になりますが、
「QMLはWebページで言うところのHTML的なものっぽいわね」
と思いました。

余談: QMLがHTML的なものと考えると……、

また更に個人の感想で恐縮ですが、
「QMLがHTML的なものと考えると、できる限りQMLとJavaScriptは分けて書いた方が行儀がいいのかな」
と思った次第です。
今日のWebアプリはSPAだったりする場合、クライアントのブラウザにJavaScriptを読んでもらって動的にDOM編集していることも多いのでこの限りではないかもしれませんが。


QtはECMAScriptに準じています

以下、何らかの情報を得てQtScript(Qtで利用するJavaScript)の情報を漁っている方向けに書き残します。

特に特殊な実装はしていません。ご安心を。

Qt4までの話はこちら。
Qt Script - Qt Documentation

Qt5以降はまとまったドキュメントは見つけられませんでした。代わりに上記リンク先の一文では、

Warning: This module is not actively developed. It is provided for backwards compatibility with Qt 4 only. For new code, use QJSEngine and related classes in the Qt QML module instead.

との事なので、案内通りにQJSEngineの方から掻い摘んで、Qtの提供しているAPIを確認した方が良さそうです。Details Descriptionの章を斜め読みした限りでは、ES2015で新たに追加された仕様(特に import, export といったモジュール機能)も使える様になっていると見受けられるので。


以上が、
「C#が本業のスクリプトキディがDJコントローラー(Numark NV)を買ったものの、やっぱり対応していなかったので、Mixxxのスクリプトを暇な時に書いてみた
限りで得た情報です。

kokawa2003さんはもちろん、他QtScriptの情報、もっと言えばMixxxのコントローラースクリプト開発に取り組もうとしている方の参考になれば幸いです。

投稿2020/03/16 09:54

manzyun

総合スコア2244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokawa2003

2020/03/16 10:44

MIDIって言葉を久しぶりに聞いて涙が流れそうですが、それはそうとして、わざわざありがとうございます。
manzyun

2020/03/16 10:59

いえいえ、結局のところこの回答の本心は、 「一緒にMixxxのコントローラーのスクリプト開発しようぜ?」 という不順な動機ですので。むしろ参考になったら感無量です。
guest

0

自己解決

その後わかったことは
1.Qtから*.jsの関数は呼べない(少なくとも不明)。
2.ただおなじようなスクリプトである*.qmlは呼べる。
3.qmlから*.jsの関数は呼べる。
4.qmlとJavaScriptは激似。
だから解決は
1.QtからQMLの関数を呼びQMLからJavaScriptを呼ぶ(CとJSの間にQMLをかませる)
2.javascriptをQMLにコピペしても多分OK
のどちらか。
今回安全な1でやった。QTでAJAXとかできればいいと思う。

cpp

1 { 2 QQmlEngine engine; 3 QQmlComponent component(&engine, "qrc:/test1.qml"); 4 QObject *object = component.create(); 5 6 QVariant returnedValue; 7 QVariant msg = "Hello from C++"; 8 QMetaObject::invokeMethod(object, "myQmlFunction", 9 Q_RETURN_ARG(QVariant, returnedValue), 10 Q_ARG(QVariant, msg)); 11 12 qDebug() << "QML function returned:" << returnedValue.toString(); 13 delete object; 14 }

qml

1import QtQuick 2.0 2import "mytestjs.js" as Util // JSファイルをインポート 3 4Item { 5 function myQmlFunction(msg) { 6 console.log("Got message:", msg); 7 var res=Util.debugOutputToConsole(msg); 8 return res; 9 } 10} 11

javascript

1.pragma library // ステートレスライブラリにすると追加される 2 3var is_debug = true; 4// デバッグ文字列をコンソールへ出力 5function debugOutputToConsole(message) { 6 if(is_debug){ 7 console.debug(message); 8 console.log("ookawa"); 9 } 10 return "koji"; 11} 12

デメリットはスクリプトのエラーが実行時までわからないこと
スクリプトファイルをリソースに入れる必要があることです。
メリットは
JSにブレークポイントがつけられること
console.logがつかえること
履歴にQMLが分かると言えること。
以上
また念のためいっておきますが
QQmlComponent component(&engine, "qrc:/test1.qml");
をJavaScriptに変えたらどうか?はやってみたけどだめでした。
また一応コンパイルする環境なのでそのソースをスクリプトと呼んでいいのかも不明。
JSがスクリプトなのは常識だから....。QMLは知らん。

投稿2018/07/31 07:56

kokawa2003

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問