投稿

ラベル(Qt)が付いた投稿を表示しています

Qtでlibmpvでの動画再生

mpvはWindows/MacOS/Linux対応のメディアプレイヤーである SMPlayerなどのバックエンドとして使われるが単体でも再生が可能 そのmpvにはlibmpvというAPIが付属しておりアプリケーション内で再生や制御を行える 今回はこれを使用し動画再生アプリを作成する まずは.proに以下を追加 既にKeyがある場合はそれに追加で QT_CONFIG -= no-pkg-config CONFIG += link_pkgconfig PKGCONFIG += mpv x11 次にmain.cppのQApplicationの宣言の下辺りに以下を追加 setlocale(LC_NUMERIC, "C"); あとはクラスに書いていくのだが mpvで動画を再生するのには再生先(QWidget)が必要となる なのでQWidgetを継承したカスタムクラスの"Player"を作成し、まとめて書いてしまうことにする QtCreator(QtDesigner)で配置した場合はPlayerへの格上げを忘れないように ヘッダには以下のincludeを追加 #include <mpv/client.h> #include <mpv/render.h> #include <mpv/qthelper.hpp> あわせてprivateに以下を追加 mpv_handle *mpvHandle = nullptr; ソースのincludeの下に以下を static void wakeup(void *ctx) {     Player *player = (Player *)ctx;     emit player->mpv_events(); } そして以下を追加しrun_mpv()はPlayerの初期化の際に読み込む(コメントアウト部分は後述) void Player::run_mpv() {     mpvHandle = mpv_create();     if (!mpvHandle)     ...

Qtで作るAndroidアプリケーション

AndroidでQtアプリケーションを実行するまで でアプリケーションの実行ができるようになったので、実際にアプリケーションを作る際のポイントを記す 必要ないこともあるかと思うが、今現在動いているものである プロジェクトの作成  前ので書いたとおりプロジェクトの作成時に対象端末用のAndroidキットを指定する デザイナでの配置  Android上でデザインが変わることもあるが、ウィジェットは同じ様に配置できる  ただしレイアウト上に置かないと配置が崩れるので注意 AndroidManifest.xmlの配置  一旦実行した後にプロジェクトフォルダ内の android-build フォルダを開き AndroidManifest.xml をコピーしてくる プロジェクトフォルダに android-sources フォルダを作成しコピーした上記ファイルを貼り付ける Qtに戻りサイドバーのプロジェクトから「既存のファイルを追加」を選択し android-sources フォルダ内の AndroidManifest.xml を指定する アイコンの設定  上記で追加したAndroidManifest.xmlをダブルクリックでAndroid Manifestエディタで開かれる  「アプリケーションアイコン」で大中小のアイコンを設定できる Javaクラスを読み込む  Qtのコードのみで出来る部分もあるが、Androidの設定に関わることなど出来ないことも多い  そのためQtからJavaのコードを実行する仕組みが用意されている  AndroidManifest.xmlをダブルクリックでAndroid Manifestエディタを開きパッケージ名を確認  以下を参考にフォルダを作成 パッケージ名  org.qtproject.example.TestApp 作成するフォルダ  プロジェクトフォルダ/android-sources/src/org/qtproject/example/TestApp このフォルダ内に.javaファイルを作成 内容はアプリケーションによるが一応枠組みのサンプルを記載 サンプ...

AndroidでQtアプリケーションを実行するまで

イメージ
QtはAndroidアプリの作成に対応しており、PC用のアプリケーションと同じように作ることが出来る やりたいことによってはJavaのコードを書く必要もあるが 基本的なことは出来るので、普段Qtを使っている人にはいいだろう でもJavaが使えるのであればJavaで書いたほうがよっぽど楽で良い JDKのインストール  既にインストールされているかもしれないが、今現在入ってるものは   jdk8-openjdk  8   jre8-openjdk  8 Android Studioのインストール  これの設定画面にある  「Android SDK」->「SDK Platform」で 対象バージョンのSDKを入れる  別タブの「SDK Tools」で   Android SDK Build-Tools   Android SDK Platform-Tools   Android SDK Tools   NDK  の4つを入れる Qtのインストール  ManjaroにもQtとQtCreatorのパッケージは存在するが、それでは動かない  Android用のファイルが入っていないためにキットが検出されないのだ  そこで、 Qt公式 からインストーラのqt-opensource-linux-x64-5.12.2.runをダウンロードする  使用したのは上記のオフラインインストーラだが、 ここから オンラインインストーラをダウンロードしても問題ないかと思う ※5.12を入れたところ表面上は問題なかったが、実行時にQPushButtonの長押しなどで QMetaObject::invokeMethod: No such method QPushButton::inputMethodQuery(Qt::InputMethodQuery,QVariant) と出てしまい長押し処理が中断されてしまう現象が発生した 5.9では問題ないので、この問題が発生する場合は 最下の AndroidでQtアプリケーションを実行する方法Old を参照すること...

Qtでのカスタムウィジェットの作り方

イメージ
Qtには便利なウィジェットが数多く用意されているが、それぞれに適した機能のみが実装されている 描画についてはQt Style Sheetsによって、強力なカスタマイズが可能だが 対応しているプロパティは限定的であり、動的な変更に向かない、また対象環境を考慮しづらいのが欠点である 対象環境を考慮しづらいというのは例えば、QLabelの背景色に白を想定し、枠線色をスタイルシートで黒に設定するとしよう これがもしユーザーのテーマの背景色が黒だった場合に色が同化し枠線の意味をなくしてしまう これを防ぐために背景色をスタイルシートで白に固定させると今度は文字色が被り、文字色を黒に設定する必要が・・・となってしまう 左から想定、テーマが黒、背景色を白指定 しかし、カスタムクラス化し描画やイベント時の動作を書き加えることで、より広範囲にカスタマイズすることが可能だ 例としてQSliderをカスタムクラス化し、文字を表示できるよう順を追って説明していく まず通常が画像のようになっているがこれに文字を追加するにはQSliderのカスタムクラスを作成する //ヘッダ class CustomSlider : public QSlider { Q_OBJECT public: explicit CustomSlider(QWidget *parent = nullptr); explicit CustomSlider(Qt::Orientation orientation, QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *e) //描画を行う }; //ソース CustomSlider::CustomSlider(QWidget *parent) : QSlider(parent) { } CustomSlider::CustomSlider(Qt::Orientation orientation, QWidget *parent) : QSlider(parent) { setOrientation(orientation); } CustomSlider:paintEvent(QPaintEvent *e) { QS...

Qt Creator 4.7が遅い

Qt Creator 4.7のテキスト編集が遅い Qt Creator 4.7にバージョンアップされて時間が経っている上に、既にArchの方では4.7.1が出ているので、解消されるかもしれないが念の為 Qt Creator 4.7でコードを書いていると、変数名や関数名などの色付けが遅れることが多発する それはまだ良いのだが、補完候補の表示も遅れるので非常に苦痛 解消するには メニューの [ヘルプ] から [プラグインについて] を押下し開いたウィンドウから ClangCodeModel のチェックを外し再起動 ただ、今後高速化の可能性もあるので、変更したことは覚えておくこと

Qt Tips

Qt Code QtCreatorやQtアプリケーションで日本語入力する sudo apt-get install fcitx-libs-qt5 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ 内の /libfcitxplatforminputcontextplugin.so を /Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/ と /[version]/gcc_64/plugins/platforminputcontexts/ にそれぞれコピー デバッグログに出力 qDebug() << "Hello World";  >>Hello World int num = 50; qDebug() << "Number is" << num;  >>Number is 50 基本的な変数であれば直接表示してくれる カーソル位置に対象のウィジェットがあるか判定する関数 bool MainWindow::isTarget(QWidget *wid) {   if (!wid->isVisible())     return false;   return wid->rect().contains(wid->mapFromGlobal(QCursor::pos())); } EventFilterの引数にある*QObjectでは マウスカーソル位置のウィジェットを取得するので 対象のウィジェット内にカーソルがあるか判定したい時はこっち connect()やQTimer::singleShot()で変数を渡す QString str = "OK"; QTimer::singleShot(3000,[=](){ qDebug() << str; });   After 3sec >>OK  connect(pushButton,&QPushButton::clicked,[=]()...