2025年11月18日火曜日

Qt ComboBoxの更新時シグナルを一時的に無視

一時的にシグナルを無効化するには 
QString oldText = cb->currentText();  // 現在の文字を保存
cb->blockSignals(true);  // イベントを一時的に無効化
cb->clear();
cb->addItems(items);
cb->setCurrentText(oldText);  // 元の文字に戻す
cb->blockSignals(false);  // イベント再開

これは、いろんな場面で必要になってくる定石?
QString oldText = cb->currentText();
{
    QSignalBlocker blocker(cb);  // ブロック開始
    cb->clear();
    cb->addItems(items);
    cb->setCurrentText(oldText);
} // ブロック終了と同時に自動復帰
という方法もあるとのこと。

2025年11月17日月曜日

Qtでボタンをグリッド内でDrag&Dropするコード

 よく使いそうな機能なので、ChatGPTといろいろやりとりしながら、BugFixして完成したものです。グリッド内のボタンをDrag&Dropで動かせるので、対応関係の設定などに利用すると便利そうです。


DraggableButton.h

DraggableGridWidget.h

DraggableGridWidget.cpp

mainwindow内のダイアログ起動コード

2025年11月14日金曜日

Qtで、同時に2つのmodelを扱う例

 ChatGPTに聞いてみたところ、modelを切り替えながら処理する場合どうするか、だいぶ複雑にはなる。あまり見慣れないコードだけど、これで動くようになる。(家計簿で、口座間移動処理データを同時に2つ削除するときのslotの部分)


モデルを使って「いったん読み込んで処理してから反映」としたのは、複数行選択
元テーブルの情報を参照先テーブルの削除条件に使う、という 2つのモデルを絡めた処理 を安全に実装するための手法、ということのようです。

C++の参照、ポインタ復習

 Qtで、最近ほとんど使ってなかったポインタや参照をC++で久しぶりに使うことになったが、ほとんど忘れていた。少し復習してみた。

#include <iostream>
using namespace std;
int func(int& x);
int func2(int* y);

int main(void){
    int a=10;

//  int& x=  では別名にしたい変数をもってくる   ①
// int x= ではコピーしたい変数をもってくる(関数型言語ではこちらの手法)

    int &b=a;  //参照渡し (1)
     printf("%d\n",b);     
     b=11;     
     int b2=a; //コピー渡し
     printf("%d\n",b2);     
     b2=12;    

// int* y= ではアドレスを代入 ②

    int *c=&a; //参照
    printf("%d\n",*c);           

    char* e="a";
    printf("%s\n",e);   
// 関数の引数でも同様
    int d=func(a);
    printf("%d",d);

    int g=func2(&a);
    printf("%d",g);
    
}

int func(int& x){  //参照 渡し ①
    return x;
}

int func2(int* y){  // ②
    return *y;
}
 
自分なりの覚え方として、次のように考えてみた。
・&xはxのアドレス *yはyがアドレスのときの値 なので、&と*は逆関数の関係ともいえそう。    *(&x) == x   &(*p) == p
・int &b=a    int *c=&a   これらをよくみると、b=a  c=&aは、どちらも同じ
   注意が必要なのは 値が入るのはbと*cであるということ
 →それと整合性とれるように、int &bのintは&bでなくbに適用され、int *cのintは *cに適用されるともいえそう。
 

2025年11月10日月曜日

Qtでいろいろ作成

 家計簿、スケジューラ、日記は、これまで.Net使った自作アプリを使ってきたが、今後Linuxでも使えるようにするため、すべてQtで作り変えることにした。スケジューラと日記はほぼ完成する。日記は、SQlite保存なので、暗号化したテキストで保存することにした。.NETに比べると復号が入っても検索処理も圧倒的に早くなっている。(.NETだと遅すぎて暗号処理を諦めていたけれど、Qtはその点心配はないようだ。)

  昨今は、C++に変わり、Rustあたりが速度を要求されるアプリに使われつつあるということだけれど、QtでC++も悪くないように思う。

2025年11月9日日曜日

QtでSqliteつかいたいとき

CMakeList.txtに以下3行追加必要

 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Sql)

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Sql)


target_link_libraries(QtDiary PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)

git pullのエラー解決 (覚書)

 error: Your local changes to the following files would be overwritten by merge: CMakeLists.txt.user Please commit your changes or stash them before you merge. Aborting

この場合、git stash > git pull > git stash pop を試してみる

CMakeLists.txt.user は通常 IDE のユーザー固有設定ファイルなので、プロジェクトによってはバージョン管理に含めないこともあるとか(.gitignore に追加したほうがいい)

コンフリクトしたら
<<<<<<< Updated upstream
(リモートの変更)
=======
(自分の stash の変更)
>>>>>>> Stashed changes     となっているので、===や<< >>を削除し、どちらかを残す


git add CMakeLists.txt.user
git commit -m "Resolve merge conflict in CMakeLists.txt.user"

.gitignoreにCMakeList.txt.user追加したら反映させるために
git rm --cached CMakeLists.txt.user
git rm -r --cached .
git add .
git push