2012年1月30日月曜日

( Qt C++ )アプリアイコンへドラッグ&ドロップしそのパスを取得


はいそれでは表題の件やっていきます。

windowsなんかではアプリアイコンへファイルをドラッグ&ドロップしアプリを起動するなんてことがあるかと思います。その時にこの記事が役に立つかと思います。

サンプルは独自のものを使用します。
そして、いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)

ではコードを


(main.cpp)
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.setText_to_List(a.arguments());//ここ重要
    w.show();
    return a.exec();
}

はい簡単ですね。わかっているとは思いますがこれはGUIアプリケーションです。

QApplication クラスは、GUI アプリケーションの制御フローとメインの設定を管理します。
QtCreaterを使用している場合は自動で記述されているので特に気にしたことはないかと思いますがいろんな設定をここでやっているそうです。(QApplicationリファレンス

それでこのQApplication aにmainのc++の各引数argc(argvの数)とargv(起動の際の引数)を引数にした後は,aから起動引数にアクセスできます。別に char* argv[]に直接アクセスしてもいいのですが、QStringList, QStringなどとして扱う場合はQApplication aからアクセスしたほうが最初からその型で返ってくるので処理が楽です。

上記サンプルではa.arguments()で起動引数すべてをQStringListで返し、それをMainWindowのsetText_to_List(独自関数)の引数にして渡しています。

※なおargvには[0]に自身のアプリケーションの絶対パス。[1]以降にドラック&ドロップしたファイルのパス、もしくは起動時設定した文字列が格納されます。

MainWindowは以下のようなコードになります。


(mainwindow.h)
#include <QMainWindow>
#include <QStringList>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT//マクロ
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void setText_to_List(QStringList strlist);//この関数を使用し起動引数を表示
    
private:
    Ui::MainWindow *ui;//uiにはGUI部品についての記述
};

(mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//コンストラクタ
{
    //uiにはGUI部品について記述
    //ここで初期化しています。
    ui->setupUi(this);
}

MainWindow::~MainWindow()//デストラクタ
{
    delete ui;
}

//argvをQStringListで受け取りQListWidgetにすべて表示する
void MainWindow::setText_to_List(QStringList strlist)
{
    foreach(QString str , strlist)
        ui->listWidget_2->addItem(new QListWidgetItem(str));
}

はい簡単ですね。uiについては”Qtをはじめよう"か何かで確認してください。ここでの理解にはあまり重要ではないので説明は省きます。

ヘッダ部、cppともに見ての通りです。重要なのはsetText_to_List関数で起動引数をQListWidgetにセットしているとこだけです。

実行すると以下のようになります。



(ドラック&ドロップしアプリアイコンの上にカーソルを持ってきている場面)
 

(起動後の画面)

 

ちゃんとドラッグ&ドロップしたファイルの絶対パスが取得できていますね。

以上です。