fit_saka
2016年3月16日 16時49分
お世話になります、坂本と申します。
Armadillo-840液晶モデル開発セットのアプリケーション開発を
QtCreatorを使用しながら行っております。
製品マニュアルの第14章「Qt-GUIフレームワーク」を参照し
作成したウィンドウ表示を遷移させようとしていたのですが、
実行上のエラーを解消できず、今回質問させていただきます。
QtCreatorのデザインで配置したボタンのクリックに対応して
別のウィンドウを新たに表示させ、現在のウィンドウは閉じる
という処理を実現しようとしているのですが、
Armadillo用にリビルドした上でリモート実行を行うと
遷移を行う途中で処理が止まってしまいます。
最初の起動時にはウィンドウやボタンもLCD上に表示されるのですが、
ボタンをタッチでクリックすると以下のような出力で停止します。
QOpenGLFunctions created with non-current context
QOpenGLShaderProgram::attributeLocation( vertexCoordEntry ): shader program is not linked
QOpenGLShaderProgram::attributeLocation( textureCoordEntry ): shader program is not linked
QEGLPlatformContext::swapBuffers(): eglError: 12301, this: 0x129b28
QEGLPlatformContext::makeCurrent: eglError: 300d, this: 0x129b28
Armadillo-440に対して別環境でビルドを行った際には
実行してもこちらは見かけ問題なく動作できていたので、
設定かコードの問題かを現状判断できないでいます。
環境はArmadillo-840のダウンロードページで現在提供されている
ATDE5をマニュアルに沿ってセットアップしただけの状態でして、
こちらのデスクトップ用にCreatorでビルド・実行した場合にも
ウィンドウの切り替え処理は確認できております。
以下にQtCreatorで作成したスケルトンのファイルを添付します。
知識不足で申し訳ないのですが、何かご教授いただけましたら幸いです。
ファイル | ファイルの説明 |
---|---|
hello.zip |
コメント
fit_saka
at_yashi
2016年3月16日 17時43分
> QOpenGLFunctions created with non-current context
> QOpenGLShaderProgram::attributeLocation( vertexCoordEntry ): shader program is not linked
> QOpenGLShaderProgram::attributeLocation( textureCoordEntry ): shader program is not linked
> QEGLPlatformContext::swapBuffers(): eglError: 12301, this: 0x129b28
> QEGLPlatformContext::makeCurrent: eglError: 300d, this: 0x129b28
a840の Qtは、eglfs (EGL Full Screen)を使っています。
http://doc.qt.io/qt-5/embedded-linux.html#eglfs
eglfs は、ひとつの native window しか持てないため、native window をバックエンドに持っている
ふつうの QWidget を複数同時に持つことができません。
解決方法としては、3つあります。
- a400のように X Window System (Kdrive)を動かし、xcb backendを使う
- 一つの Widget だけで、自分で画面遷移を作成する
- QMLを使う
それぞれ、向き不向きがあります
- X: a400 や Desktopのように開発できる。(Kdriveでは)OpenGLを使えないので、きれいなアニメーションなどには不向き
- Widget: C++ で QPaintが使える。でも、デスクトップのように Widget を切り貼りすることができない
- QML: QtQuickなどで、今風の画面が作成できる。新しく QML を勉強する必要がある