QT開発環境の構築とQWTライブラリの導入、DLLエラー対策、UIコンポーネント連携及びExcel操作テクニック

QT環境変数の設定方法

Windows環境でQTを利用するには、以下の手順で環境変数を設定する必要があります。

  1. 「設定」→「システム」→「詳細情報」→「システムの詳細設定」を選択
  2. 「環境変数」ボタンをクリック
  3. 「システム環境変数」セクションの「Path」を選択し「編集」をクリック
  4. 以下のQT関連パスを追加:
    • C:\Qt\5.15\mingw81_32\bin
    • C:\Qt\Tools\mingw810_32\bin

設定後、PCを再起動すると変更が適用されます。

QWTライブラリの導入手順

QWTはQT用の科学技術グラフィックスライブラリです。以下の手順で導入します。

  1. QWTソースコードをQTインストールディレクトリ(例:C:\Qt)に配置
  2. qwt.proファイルをQT Creatorで開く
  3. qwtbuild.priファイルを開き、「CONFIG += debug_and_release」行をコメントアウト
  4. ビルドを実行(完了まで約15分かかります)
  5. ビルド完了後、生成されたファイルを適切な場所にコピー:
    • 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
  6. インクルードファイルの設定:
    • 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エラーの解決方法です。

  1. リリースビルドした実行ファイル(.exe)を新しいフォルダにコピー
  2. QTコマンドプロンプトを開き、実行ファイルのあるディレクトリに移動
  3. 以下のコマンドを実行:
    cd /d D:\app_folder
    windeployqt application.exe
  4. 不足しているDLL(qwt.dll、QtOpenGL.dllなど)をQTインストールディレクトリからコピー
  5. 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形式で保存したファイルのデータ区切り手順:

  1. 「データ」タブ→「区切り位置」を選択
  2. 「カンマやタブなどの区切り文字...」を選択し「次へ」
  3. 区切り文字として「カンマ」にチェックを入れ「次へ」
  4. 列のデータ形式を「標準」に設定し「完了」

.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)

列全体への数式適用

大量のデータに数式を適用する方法:

  1. 最初のセルに数式を入力しEnterキーを押す
  2. 最初のセルを選択したまま、スクロールして最終セルへ移動
  3. Shiftキーを押しながら最終セルをクリック(範囲選択)
  4. Ctrl + Dキーを同時に押す(数式が範囲全体に適用)

科学表記から通常表示への変換

科学表記を通常の数値表示に変換する方法:

  1. 方法1:空セルに「=TRIM(A2)」と入力
  2. 方法2:
    • セルを右クリックし「セルの書式設定」を選択
    • 「表示形式」タブで「ユーザー定義」を選択
    • 「種類」ボックスに「0」と入力し「OK」をクリック

タグ: Qt QWT 環境設定 DLLエラー TreeWidget

6月3日 20:18 投稿