Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

gtkmmでwindow位置を可変にする方法

今回はgtkmmでwindowの位置を変更する方法についてまとめていきたいと思います!!
位置を指定してwindowをいくつか座標を指定して配置したい時などに使用できるかな?と思います。



■条件

今回gtkmmでwindowの位置を指定するにあたり、windowのレイアウトはgladeというデザイナーを用います。
gladeの導入方法やgtkmmとの連携方法についてはこちらにまとめております。
elsammit-beginnerblg.hatenablog.com

またOSですが、Ubuntu20.04を用い、
gtkmmのバージョンはgtkmm-3.0を用います。

■windowを準備

gladeによるデザインですが、こちらの通りImage Widgetが1つおいてあるだけのシンプルなwindowにします。
f:id:Elsammit:20210707225327p:plain

またwidget ID名ですが、
・widdow:TestWindow
・Image:_Image
としました。

またヘッダファイルとして下記を定義しました。

class MainWin : public Gtk::Window {
    Gtk::Window TestWindow;
    Gtk::Image* _Image;
    Glib::RefPtr<Gtk::Builder> builder;

public:
    MainWin(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
};

■windowの位置を指定する

では本題の位置指定をしていきます。
位置指定ですが、

MainWin::MainWin(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) :
    Gtk::Window(cobject), builder(refGlade) {
    
    gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y);

    ・・・

というように、gtk_window_moveを用いればOKです。
下記の通り、x軸(input_x)、y軸(input_y)を指定することでwindowの座標位置を指定することが可能です。
この座標ですが、windowの左上端の位置に該当します。

 gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y);

全体のコードはこちらのように記載しました。

MainWin::MainWin(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) :
    Gtk::Window(cobject), builder(refGlade) {

    gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y);
    this->builder->get_widget("_Image", this->_Image);
    this->_Image->set("画像ファイル名");
}

こちらのinput_x、input_yを指定する際に、ファイルなどの外部ファイルからセットするようにすればwindowを動的(可変)にセットすることが出来ます。
例えば、

void FileRead(){
    std::ifstream ifs(fileName);
    std::string str;
    if (!ifs){
        std::cout << "ファイルが開けませんでした。" << std::endl;
        return;
    }
    int i = 0;
    while(getline(ifs, str)){
        if(i == 0){
            input_x = std::stoi(str);
            i++;
        }else if(i == 1){
            input_y = std::stoi(str);
            i++;
        }
    }
}

というようにテキストファイルを読み出し、input_x、input_yにx座標、y座標を指定するようにします。
こうすることにより、細かい座標位置を外部ファイルで調整できるようになるので調整しやすくなります。

■(おまけ)座標の動的指定について

windowの位置を指定する、

 gtk_window_move(GTK_WINDOW(gobj()), input_x, input_y);

ですが、windowを生成した後でも位置変更が可能です。
このため、ボタンwidgetを設置してボタンクリックするとwindowの位置が移動するコードの作成も可能になります。

■まとめ

今回はgtkmmでwindowの座標位置を指定する方法をまとめておきました。
話しは変わりますが、Flutterがwindowアプリや組み込みに対応しましたね。
どうなんだろう??トヨタのカーナビに採用されたようだけど。
今度使ってみたいと思います!!