読者です 読者をやめる 読者になる 読者になる

サクッとプログラムした気になる (3)

Tips PC

作ったスクリプトを呼び出すガワを作る

スクリプトだけだとアプリケーションにならないので呼び出してくれるガワを作りました。

導入

  • Qtをインストーラー経由で入れる
  • Qt Creator起動
  • 「新しいプロジェクト」→「Qtウィジェットアプリケーション」
  • 「無題」だと怒られるので適当にアルファベットで名前をつける。取り敢えず「gawa_sample」

f:id:moguriso:20160614130112p:plain:w400
普通に入れててVS入ってない場合はMinGWだけのはずですが、VSしたい場合はチェック(デバッグ用のWindowsSDK入れないとデバッガが無いと怒られました)
残りは「次へ」→「完了」

ボタンを乗っけてslot追加

「フォーム」→「mainwindow.ui」をダブルクリック
f:id:moguriso:20160614130539p:plain:w450
こんな感じのはずなので、「Push Button」をドラックしてドロップ
f:id:moguriso:20160614130718p:plain
追加したボタンで右クリックして「スロットへ移動」
f:id:moguriso:20160614130826p:plain:w400
clicked()でOK。

VBScriptを呼び出す

地味に大変。COMのスクリプトを呼び出すのはQAxScriptManagerとQAxScriptを使うそうで、、、

QAxScriptManager Class | Active Qt 5.7

mainwindow.hを↓(addが追加部分)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAxScriptEngine>      //add
#include <QAxScript>            //add
#include <QDebug>               //add

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

    QString getArtworkPath();     //add
    void nextTrack();             //add
    QAxScriptManager *m_manager;  //add
    QAxScript *m_script;          //add
};

#endif // MAINWINDOW_H

mainwindow.cppも↓な感じにいじる

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    /* add (ここから) */
    m_manager = new QAxScriptManager(this);
    bool isRegistered = m_manager->registerEngine("VBScript", "vbs");
    if(isRegistered){
        qDebug() << "OK to register VBScript";
        m_script = m_manager->load("C:\\msys64\\home\\adachi\\test.vbs", "HelloWorld");
    }
    else
        qDebug() << "NG to register VBScript";
    /* add (ここまで) */

    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    /* add (ここから) */
    if(m_script)
        delete m_script;
    if(m_manager)
        delete m_manager;
    /* add (ここまで) */

    delete ui;
}

/* add (ここから) */
QString MainWindow::getArtworkPath()
{
    QString rStr = "";

    if (m_script){
        QVariant var = m_script->call("getArtworkAndPath()");
        qDebug() << var.toString() << "loaded";
        rStr = var.toString();
        qDebug() << "rstr = " << rStr;
    }
    else
        qDebug() << "didn't load";

    return rStr;
}

void MainWindow::nextTrack()
{
    if (m_script){
        m_script->call("nextTrack()");
        qDebug() << "loaded";
    }
    else
        qDebug() << "didn't load";
}
/* add (ここまで) */

void MainWindow::on_pushButton_clicked()
{
    /* add (ここから) */
    QString path;

    nextTrack();
    path = getArtworkPath();

    qDebug() << path;
    /* add (ここまで) */
}

"C:\\msys64\\home\\adachi\\test.vbs"のところは自分のファイルに置き換えが必要です。

デモ

ちゃんと出来ていればこんな感じになるはず。

写り込みの範囲内に収まりそうにないので動画は削除しましたm(_ _)m


アプリにしようと思うと、途端に面倒くさくなりました。