QT環境変数の設定方法
Windows環境でQTを利用するには、以下の手順で環境変数を設定する必要があります。
- 「設定」→「システム」→「詳細情報」→「システムの詳細設定」を選択
- 「環境変数」ボタンをクリック
- 「システム環境変数」セクションの「Path」を選択し「編集」をクリック
- 以下のQT関連パスを追加:
- C:\Qt\5.15\mingw81_32\bin
- C:\Qt\Tools\mingw810_32\bin
設定後、PCを再起動すると変更が適用されます。
QWTライブラリの導入手順
QWTはQT用の科学技術グラフィックスライブラリです。以下の手順で導入します。
- QWTソースコードをQTインストールディレクトリ(例:C:\Qt)に配置
- qwt.proファイルをQT Creatorで開く
- qwtbuild.priファイルを開き、「CONFIG += debug_and_release」行をコメントアウト
- ビルドを実行(完了まで約15分かかります)
- ビルド完了後、生成されたファイルを適切な場所にコピー:
- build-qwt-Desktop_Qt_5_15_1_MinGW_32bit-Debug\designer\plugins\designer\qwt_designer_plugin.dll → C:\Qt\5.15\mingw81_32\plugins\designer
- build-qwt-Desktop_Qt_5_15_1_MinGW_32bit-Debug\lib\qwt.dll → C:\Qt\5.15\mingw81_32\bin
- build-qwt-Desktop_Qt_5_15_1_MinGW_32bit-Debug\lib\libqwt.a → C:\Qt\5.15\mingw81_32\lib
- インクルードファイルの設定:
- C:\Qt\5.15\mingw81_32\includeに「qwt」フォルダを作成
- qwt-6.2.0\src内の全ファイルを上記フォルダにコピー
プロジェクトファイル(.pro)に以下を追加してQWTを使用可能にします:
LIBS += -L "C:/Qt/5.15/mingw81_32/lib" -lqwt
INCLUDEPATH += C:/Qt/5.15/mingw81_32/include/qwt
「QT5core.dllが読み込めない」エラーの解決
他のPCでQTアプリケーションを実行する際に発生するDLLエラーの解決方法です。
- リリースビルドした実行ファイル(.exe)を新しいフォルダにコピー
- QTコマンドプロンプトを開き、実行ファイルのあるディレクトリに移動
- 以下のコマンドを実行:
cd /d D:\app_folder windeployqt application.exe - 不足しているDLL(qwt.dll、QtOpenGL.dllなど)をQTインストールディレクトリからコピー
- Enigma Virtual Boxを使用して単一実行ファイルにパッケージ化:
- メイン実行ファイルを選択
- 必要なDLLファイルを追加
- 「ファイルオプション」で圧縮を有効にして実行
パッケージ化した実行ファイルは、依存DLLなしで他のPCでも実行可能になります。
TreeWidgetとTabWidgetの連携実装
レイアウト設定
メインウィンドウUIデザイナーで、TreeWidgetを配置し、以下のプロパティを設定:
- sizePolicy: [Fixed, Expanding, 0, 0]
- maximumSize: 300×16777215
TabWidgetへのページ追加
ui->tabWidget->insertTab(0, &portSettings, "ポート設定");
ui->tabWidget->insertTab(1, &formatConfig, "フォーマット");
ui->tabWidget->insertTab(2, &chartDisplay, "グラフ");
ui->tabWidget->insertTab(3, &commandPanel, "コマンド");
ui->tabWidget->insertTab(4, &dataLogger, "記録");
ui->tabWidget->insertTab(5, &textView, "テキスト");
TreeWidgetへのノード追加
ui->treeWidget->clear();
ui->treeWidget->setColumnCount(1);
ui->treeWidget->setHeaderHidden(true);
ui->tabWidget->tabBar()->hide();
// スタイル設定
ui->treeWidget->setStyle(QStyleFactory::create("windows"));
// [システム設定] 親ノードの作成
QTreeWidgetItem *systemNode = new QTreeWidgetItem(ui->treeWidget, QStringList(QString("システム")));
systemNode->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
// 子ノードの追加
QTreeWidgetItem *portNode = new QTreeWidgetItem(systemNode);
portNode->setText(0, "ポート");
QTreeWidgetItem *formatNode = new QTreeWidgetItem(systemNode);
formatNode->setText(0, "フォーマット");
QTreeWidgetItem *commandNode = new QTreeWidgetItem(systemNode);
commandNode->setText(0, "コマンド");
// [表示] 親ノードの作成
QTreeWidgetItem *displayNode = new QTreeWidgetItem(ui->treeWidget, QStringList(QString("表示")));
displayNode->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
QTreeWidgetItem *chartNode = new QTreeWidgetItem(displayNode);
chartNode->setText(0, "グラフ");
QTreeWidgetItem *logNode = new QTreeWidgetItem(displayNode);
logNode->setText(0, "記録");
QTreeWidgetItem *textNode = new QTreeWidgetItem(displayNode);
textNode->setText(0, "テキスト");
ui->treeWidget->expandAll();
// シグナル接続
connect(ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)),
this, SLOT(onTreeItemClicked(QTreeWidgetItem*, int)));
多数の子ノードを追加する場合は、配列を使用して効率化できます:
QString functionItems[16] = {"F0","F1","F2","F3","F4","F5",
"F6","F7","F8","F9","FA","FB",
"FC","FD","FE","FH"};
// [機能] 親ノードの作成
QTreeWidgetItem *functionNode = new QTreeWidgetItem(ui->treeWidget, QStringList(QString("機能")));
functionNode->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
// 子ノードの追加
for(int i = 0; i < 16; i++) {
QTreeWidgetItem *childNode = new QTreeWidgetItem(functionNode);
childNode->setText(0, QString("%1").arg(functionItems[i]));
}
ノードクリック時の処理
void MainWindow::onTreeItemClicked(QTreeWidgetItem *item, int column)
{
QString itemName = item->text(column);
if(itemName == "ポート") {
ui->tabWidget->setCurrentIndex(0);
}
else if(itemName == "フォーマット") {
ui->tabWidget->setCurrentIndex(1);
}
else if(itemName == "コマンド") {
ui->tabWidget->setCurrentIndex(3);
}
else if(itemName == "グラフ") {
ui->tabWidget->setCurrentIndex(2);
}
else if(itemName == "記録") {
ui->tabWidget->setCurrentIndex(4);
}
else if(itemName == "テキスト") {
ui->tabWidget->setCurrentIndex(5);
}
}
Excel関連の問題と解決策
データの区切り
.xls形式で保存したファイルのデータ区切り手順:
- 「データ」タブ→「区切り位置」を選択
- 「カンマやタブなどの区切り文字...」を選択し「次へ」
- 区切り文字として「カンマ」にチェックを入れ「次へ」
- 列のデータ形式を「標準」に設定し「完了」
.csv形式(カンマ区切り値)では、この操作は不要です。なお、.xlsbはExcelのバイナリ形式で、ファイルサイズが小さく、開く速度が速いという利点があります。
タイムスタンプ変換
Excelでのタイムスタンプ変換方法:
- 13桁ミリ秒タイムスタンプ→日時:
=TEXT((A2/1000+8*3600)/86400+70*365+19,"yyyy/mm/dd hh:mm:ss.000") - 10桁秒タイムスタンプ→日時:
=TEXT((A2+8*3600)/86400+70*365+19,"yyyy/mm/dd hh:mm:ss") - 日時→10桁タイムスタンプ:
=INT((A2-70*365-19)*86400-8*3600)
列全体への数式適用
大量のデータに数式を適用する方法:
- 最初のセルに数式を入力しEnterキーを押す
- 最初のセルを選択したまま、スクロールして最終セルへ移動
- Shiftキーを押しながら最終セルをクリック(範囲選択)
- Ctrl + Dキーを同時に押す(数式が範囲全体に適用)
科学表記から通常表示への変換
科学表記を通常の数値表示に変換する方法:
- 方法1:空セルに「=TRIM(A2)」と入力
- 方法2:
- セルを右クリックし「セルの書式設定」を選択
- 「表示形式」タブで「ユーザー定義」を選択
- 「種類」ボックスに「0」と入力し「OK」をクリック