Armadilloフォーラム

Qt使用アプリのウィンドウ遷移方法

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
コメント

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 を勉強する必要がある

fit_saka

2016年3月16日 18時15分

at_yashi様、回答ありがとうございます。

a840側では動作させるだけでQtの仕様に関しては詳しく確認していませんでした。

開発するアプリに関してはまだ検討の段階なので、
ご提示頂いた方法をそれぞれ確認してみようと思います。