土曜日, 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() をついかけてしまうような間違いを防ぐことができます。

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

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...