土曜日, 11月 11, 2023

Qt: 外部プログラムを起動する

 

Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。

外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。

この QProcess::startDetached が Qt5.10 から使用方法がアップデートされたようなので、ご報告まで。引数は外部プログラムへのパスではなく、プロセスIDをとります。

外部プログラムは QProcess::setProgram() で設定します。

金曜日, 11月 10, 2023

QTreeWidget アイテムの追加・削除

 

QTreeWidget はそのまま使えるツリー構造用のコンポーネントです。そのまま、というのは QTreeView 派生クラスなど作らなくても備え付けのデータクラスが使えるという意味です。

QTreeWidget へアイテムを追加するコードはヘルプにもありますが、ここではルート要素へも追加できるコードを置いておきます。



アイテムを削除する方法はこちらです。ルート要素の削除もできます。

水曜日, 11月 08, 2023

QTableWidget: ヘッダーのフォントをボールド化する

 

QTableWidget のヘッダーを設定し、フォントをボールド化する方法です。

QTableWidget のヘッダーは setHorizontalHeaderLabels() を呼び出し QStringList を渡すことで設定できます。

設定後、フォントを取得し、setBold() でボールドを設定します。


QTableWidget で右クリックメニュー(コンテキストメニュー)

 

QTableWidget で右クリックメニューを出す方法です。

まずQTableWidget でコンテキストメニューを有効化する必要があります。


呼び出したメソッドでメニューを作り、popup() メソッドで表示します。


アクションを設定し、実行したいメソッドを connect() で設定します。

セルの位置はマウスクリックの位置から itemAt() で計算します。

位置情報はクラス変数で保存すると使いやすいかもしれません。

あと、QTableWidgetItem が設定されていないセルではメニューを表示しない設定もできます。

木曜日, 10月 12, 2023

Qt6: アイコンを設定する(Windows)

Qt はまってます。Mac でも書いたアプリがコンパイルできて、しっかり動くのを確認しました。このあいだ Chitubox が Qt 使ってるのを知ってうれしかったです。

Mac でもそのまま動くんですが、アプリのアイコンの設定はプラットフォーム依存です。

公式マニュアルでも設定が分かりにくかったのでここでは Windows でのアイコンの設定を説明します。

アイコンの設定方法

1.ICO ファイルを作成します。https://realfavicongenerator.net/ などで作成できます。

2.プロジェクトからアクセスできる場所を選んで保存します。/images 下など。

3.Qt Creator でリソースファイル resource.qrc を作成します。プロジェクト名で右クリックメニューから Add New ... で作成できます。




4.メインウィンドウの初期化時などで、ウィンドウのアイコンを設定します。

setWindowIcon(QIcon("://images/phrases.ico"));

これでコンパイルすればウィンドウのアイコンが設定できているのが確認できます。



5.アプリの実行ファイルのアイコンは、icon.rc ファイルを作成することで設定できます。

右クリックメニューから Add New ... をクリック、Empty File を作成し、icon.rc など名付けます。


6.icon.rc へ以下の内容を書き込みます。

IDI_ICON1   ICON    "images/phrases.ico"

これで設定は完了です。コンパイルすれば出来上がった実行ファイルのアイコンが設定されているのが確認できます。

windeployqt コマンドでデプロイが終了です。

ViFlash のソースコードはこちらです。参考まで。

https://github.com/easai/ViFlash


火曜日, 9月 19, 2023

Qt6 の日本語化 (CMake, QtLinguist)

 Qt5 の日本語化の記事はあるようですが、Qt6 CMake を使っての方法が探してもなかったので書いておきます。

プロジェクト作成時、言語を設定してもそのままでは日本語化できません。

手順は以下の通りです。

  1. 空の TS ファイルを作る
  2. CMakeLists.txt を更新する
  3. CMake を用いて単語を抽出する
  4. QtLinguist で日本語化する
  5. アプリ側で QM ファイルを読み込む


空のTSファイルを作る


このファイルはプロジェクト作成時、言語を指定すると自動生成されます。指定していなければ作成します。

ファイル名は任意ですが、 <アプリ名>_ja_JP.ts などするとわかりやすいかもしれません。

空といっても骨格は記述します。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ja_JP">
<context>
</context>
</TS>

CMakeLists.txt を更新する


以下のコマンドを追加します。
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)

qt6_add_translations(I18n
    TS_FILES I18n_ja_JP.ts
    QM_FILES_OUTPUT_VARIABLE qm_files)
install(FILES ${qm_files} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}


CMake を用いて単語を抽出する


以下のコマンドをビルドのディレクトリで走らせると単語が抽出されます。
cmake --build . --target update_translations

QtLinguist で日本語化する


QtCreator で TS を右クリックすると Open With メニューから Qt Linguist を起動できます。

コマンドラインからも起動できます。


アプリ側で QM ファイルを読み込む


TS ファイルは QM ファイルへ変換されます。

アプリ側でファイルを読み込むと作業は完成です。標準コンポーネントのため、標準 QM ファイルも読み込みます。

以下のコードではロケールの設定で言語を指定します。

  QTranslator translator;
  const QStringList uiLanguages = QLocale::system().uiLanguages();
  for (const QString &locale : uiLanguages) {
    const QString baseName = "I18n_" + QLocale(locale).name();
    if (translator.load(baseName)) {
      a.installTranslator(&translator);
      break;
    }
  }
  QTranslator stdTranslator;
  for (const QString &locale : uiLanguages) {
    const QString baseName = "qt_" + QLocale(locale).name();
    if (stdTranslator.load(baseName,QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
      a.installTranslator(&stdTranslator);
      break;
    }
  }

上記の方法で作成したプロジェクトです。参考まで。
https://github.com/easai/I18n.git

木曜日, 9月 07, 2023

Qt キュート(C++ GUI フレームワーク)

 Qt キュート って GUI フレームワークがあります。案件が降ってくるとかで手を出したんですが(来なかった)書きやすいので引っかかったところとか書いておきたいと思います。C++です。

最新版が Qt6 で、CMake が標準です。ポータブルなのが売りですが Windows で使ってます。使えます。

画面を見たら分かるかと思いますが、Qt では画面のデザインが標準化されていて楽です。きっちり並んだ部品は感動です。

縦横並べるコマンドがあって、隙間をそろえる部品があります。

Qt オープンソース・ダウンロード

水曜日, 2月 17, 2021

Flask/wtform/SelectField フォームで入力チェックがうまくいかないとき

 Flask の wtform は入力値の自動チェックを行うので便利なんですが、自動チェックさせるとときどき引っかかるので面倒です。

SelectField を使うなら値はしっかり設定しておかねば入力値はすべてはじいてくれます。選択肢をデータベースからひいてきて自動設定している場合なぞ要注意です。

SelectField を設定する関数を書けば便利です。

Form をインスタンス化しただけで form.validate() をついかけてしまうような間違いを防ぐことができます。

月曜日, 2月 15, 2021

Flask/url_for() で引数を省略

Flask ではルートを指定して動作を指定します。動作は関数で記述します。Flask は指定された関数を起動します。

引数を指定することもできます。引数は<引数>の形で指定、関数の引数で受け継ぎます。この引数を省略できるのか、っていう問題です。

Python の関数はデフォルト値を持つ引数は省略できます。そのノリでそのまま引数のデフォルト値を指定してもルートは判別しません。

ここは引数なしのルートを指定してやります。関数のほうはデフォルト値を指定することで対処します。ここでルートの最後の/(スラッシュ)を指定します。

これで url_for() で引数を省略できます。


水曜日, 8月 21, 2019

Jinja (Flask/SQLAlchemy) で日付をフォーマットする

Flask/SQLAlchemy 使ってる方、jinja で困ってませんか?

本体で Python の関数を書いてもいいんですが、テンプレートでも関数が呼べます。

日付を出したい場合、フォーマットなら strftime() が使えます。


わざわざ文字列を作って渡す必要はありません。



月曜日, 7月 22, 2019

PyMongo で内部結合

PyMongo を使った内部結合の実装です。classics テーブル、baroque テーブルの内部結合を キー composer_id で照らし合わせたものです。

外部結合なら $match の部分なしで結果がとれます。

_id で照らし合わせる場合、ObjectId(id) で合わせるか文字列へ変換するか気を付ける必要があります。

土曜日, 6月 29, 2019

Python: 指数分布のグラフを書く

Python の使いやすさはただごとじゃありません。

ユーザーの層が厚いのはユーザーが多いから。人気が人気を呼ぶパターンですね。ドキュメント類の豊富さ(本家じゃなくても)が質を変えているわけです。民主主義ですよこれは。

使いにくさなんてユーザーが変えていくもんです。多くの人たちが使っていればですね。意見を取り入れる柔軟さはピカイチです。もとからかなり特色ある言語ですが、ライブラリの豊富さでも群を抜いてます。

グラフを書くのもお手の物です。使い慣れた言語で思いのままってのは数式が近く感じられていいもんです。そのままシェルからグラフが書けます。

以下のスクリプトは指数分布を描きます。




日曜日, 1月 27, 2019

Scala: BigInt で階乗を計算する

Java の BigInteger の扱いは面倒です。すべての演算が関数形式で引数を指定しなければならないのでとても不便です。オペレータ演算子を定義できない安全志向 Java の弱みでもあります。

Scala ならその心配はありません。何の躊躇もなく演算子を書き換えれば独自の世界が展開します。BigInt の扱いも自然です。オペレータ演算子をほぼすべてそのまま使えます。いわゆる中置記法(infix)で書けるので読みやすくデバッグしやすいコードが書けます。

Java: BigInteger で階乗を計算する では Java の BigInteger で階乗を計算するコードを載せました。Scala で書いたのがこれです。これだとなんか特記すべきこともないです。



比べてみれば利点は明らかです。言語設定がプログラミングの効率をどこまで上げるのか、現場を顧みない世迷いごとは「プログラミング言語はどれもC言語が基本だから(!)、基本構造が同じなら書けることは同じ」これで論破できますね。

金曜日, 9月 21, 2018

型破りな Python

Python でもっとも特徴的なのは抽象化が徹底していること。抽象化ってのはつまりパラメタ化できるってことですね。属性で値(本質)を得ることができるわけです。

変数やメンバ変数などそのものを配列で扱えます。しかも値を文字列で取得できます。これは便利ですね。グローバル、ローカル変数そのものが配列でアクセスできます。

globals()
locals()

型でさえ抽象されてます。同じ変数名で型を変えることが Python なら可能です。なんか抵抗があるようなところが型破りな Python なわけです。

a = 0  # int
a *= 1.0   # float
a = str(a)  # string

ここで型は変数の属性、変えることのできる属性の一種です。

これができるってことはつまり静的型チェックがないわけなんですが、そもそも Python はコンパイラなんてもたないんですよね。

有名どころでは、True/False がそのまま数です。


if False + 1:
    print('???')

水曜日, 9月 19, 2018

Python: try ブロックでコードが終わるとき

ゆえあってPythonでシステムを書いている今日この頃なんですが、面白い発見をしたのでここで書いておきます。

まあ、もとはといえばtry-except-finallyなど書いていて、データベース接続をどこで閉じるかっていう議論があったわけです。finallyブロックでどうか、なんていうことで議論は収束しました。

しかしながらここで「え」「これfinallyこないんじゃない」「無理だよ」「unreachable」っていう指摘が出てきたわけなんです。tryブロックで値を返していたわけなんですね。finallyへは来ないんじゃ…

しばらくして「あれ?」って声が上がりました。これです。

この結果は…(走らせてみてください)。

tryブロックで終了するコードだと起きる現象ですね。

実はこれ、Javaでも同様です(走らせてみてください)。

土曜日, 8月 11, 2018

Python でタイミング図(信号)を描く

Python ライブラリの matplotlib を使ってタイミング図を描く方法です。


それはいいんですが、ここで一言。



Python プロジェクトでライブラリのバージョンを管理するなら仮想環境が要ります。
 
numpy モジュールを読見込む際、signal.py でみごとこけました。です。

ので「休日を返せ」モードで 

(Python は素晴らしい言語かもしれないが)ライブラリ管理がなっていない。 

なってないです。つまり、Java でいう Central Repository + Maven がない。

「numpy を使うなら singal.py ファイルを作ってはならない」なる注意書きが必要です。信じがたい。



で、タイミング図を書く方法です。

ここのポイントは線グラフの描写で、毎クロックで縦線をひきます。

折れ線グラフは点を指定して図を描いているのと同じなので、x値を繰り返せばそこで縦線がひかれるわけですね。

xValue で指定しているのがそれです。

金曜日, 5月 04, 2018

Python: ファイルリストをソートする

このところゆえあって Python プロジェクトを担当しております。

括弧のない簡便さ、行末のセミコロンなし、インデント必須ってのははまりますね。

ライブラリの豊富さってのはプログラミング言語のすべてみたいなもんですが、こいつばかりは人気がモノを言います。

もっとも好まれる言語で選ばれる Python ならではの強みですね。

その Python でディレクトリ中のファイルをリストアップするスクリプトを書いてみました。

path でディレクトリを、type でソートのキーを指定します。

金曜日, 1月 19, 2018

Arduino: ネオピクセルLEDテープライト

ちょっと感動しました。このネオピクセルLEDテープライト。まずフルカラーです。

どんどん明るくなっていくLEDなんですが、このテープ、それぞれLEDを指定して点灯できるんですね。

これLEDごとレジスタがついてる。

WS8212B データシート

シフトレジスタを使ってLEDを指定して点灯する方法がありますが、その原理です。シリアルで信号を送ってそれぞれ点灯できるわけです。それぞれ切り取って使えます。

「なんてこった」って思いましたね(笑。

Arduino 使ってつないで点灯してみたんですが、これですね。いいライブラリまで出てる。鮮やか。動きがある。並べるとイメージが違う。(実際はこの動画よりもっと鮮やかですよー)

Guide for WS2812B Addressable RGB LED Strip with Arduino



プログラムです。ライブラリはこちらです。


これ並べたマトリックス・ディスプレイまで出てますが(まだ高いですね)、夢が広がります。


日曜日, 1月 14, 2018

Arduino: 光と音で警告するマウス

作ってみました。ここは当然の如く3Dプリンターで。IR距離センサーで反応します。

近づくと光と音で警告します。

フルカラーLEDで通常は青、反応すると赤、しばらくは緑が点灯します。

LEDが赤で点灯中は振動モーターで鳴ってくれます。

ケースは丸く作ったのですが思い直して両側を削って作りました。

のっかってる赤トンボは愛嬌です(頭でバランスがとれてます)。


こんな感じで動きます。




このプログラムは音声センサまでついてますが、写真のマウスは距離センサだけです(なくても動きます)。


金曜日, 1月 05, 2018

コメントを消すプログラム (flex)

できました。うざいコメントを消すプログラム。

コメントをすべて消してくれるプログラムです。

// から行末、/* */ 内を消すプログラムです。あしからず。

自分で書いても良かったんですが、flex 使ってみました。これならクオート(リテラル)の処理が自動です。

コンパイル方法は以下の通り。
flex remove-comments.l;
gcc lex.yy.c -lfl -o remove-comments.exe

ファイル名を指定してください。
./remove-comments.exe filename

追記です(2021-02-24)。Cygwin 環境での flex のインストール方法です。結論から言うと、m4 をインストール。gcc をインストールで動きます。Devel パッケージからはだめです。個別のプログラム名でインストール。

うるさいコメントがこれで消えます。

(追記)IME変換ってのはアメ公のエゴが満開ですよね。日本語は連中の所有物じゃない。冒涜です。

PHP: 定数を扱う

プロジェクトごとの定数を扱うクラス Config\Constants の紹介です。 <?php namespace Config; class Constants {     public const DB_USER = "linguist...