7

GTK3 で TreeView を取得してテキストを正しく折り返すのに問題があります。

このようにラップするように設定しました:

    Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
    static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
        ->property_wrap_mode().set_value(Pango::WRAP_WORD_CHAR);
    static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
        ->property_wrap_width().set_value(200);

これは機能し、テキストは折り返されますが、ウィンドウのサイズを変更して大きくすると、長いテキストのセルの上下に醜い空白がたくさんあります。GTK は、ラップ幅に基づいてセルの高さを予約しているようです。これは私には意味がありません。

次のように必要な幅を計算して、signal_check_resize で必要な設定を回避しようとしました。

        Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
        auto width = this->get_allocated_width()
            - mTreeView.get_column(0)->get_width()
            - mTreeView.get_column(1)->get_width();
        static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
            ->property_wrap_width().set_value(width-100);
        this->forceRecreateModel = true; //Needed to work

しかし、これではウィンドウを大きくすることしかできません。リサイズ後の縮小はできません。

問題は、これがどのように適切に行われるかです。

Arch Linux で gtk3.20.3-1 と gtkmm3.20.1-1 を使用しています。

編集:タイトルの誤字を修正...

4

1 に答える 1

6

結局、私はそれを行う方法を見つけました。

ウィンドウのセットアップ (私にとってはウィンドウ派生クラスのコンストラクター) では、幅を縮小できるように、列を AUTOSIZE に設定する必要がありました。

//Last Column setup
{
    mTreeView.append_column("Translation", mColumns.mEnglish);
    Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
    pColumn->set_sizing(Gtk::TreeViewColumnSizing::TREE_VIEW_COLUMN_AUTOSIZE);
    static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
        ->property_wrap_mode().set_value(Pango::WRAP_WORD_CHAR);
}

また、サイズ変更ごとに正しいラップ幅を設定する必要があります。これがないと、行の高さは、現在の幅に関係なく、現在設定されている wrap_width に必要な大きさになりました (さらに引き伸ばされ、ウィンドウを小さくすることを禁止すると、上部に大きなパディングが発生します)。

このコードはコンストラクターにもありました。

this->signal_check_resize().connect([this]()
{
    //calculate remaining size
    Gtk::TreeViewColumn* pColumn = mTreeView.get_column(2);
    auto width = this->get_allocated_width()
        - mTreeView.get_column(0)->get_width()
        - mTreeView.get_column(1)->get_width()-30;

    //minimum reasonable size for column
    if(width < 150)
        width = 150;

    static_cast<Gtk::CellRendererText *>(pColumn->get_first_cell())
        ->property_wrap_width().set_value(width);

    //debounce
    static auto oldsize = 0;
    {
        oldsize = width;

        //trigger redraw of mTreeView (by clearing and refilling Model,
        //it is done in 100ms pulse)
        this->mRedrawNeeded = true;
    }
});

そしておそらく、Gtk::ScrolledWindow にカプセル化された mTreeView があることは注目に値します。したがって、これは列のセットアップの前に来るチャンクです。:)

//in class is: Gtk::ScrolledWindow mScrollForResults;

//scrolling area
mGrid.attach(mScrollForResults, 0,2,10,1);
mScrollForResults.set_hexpand();
mScrollForResults.set_policy(Gtk::PolicyType::POLICY_AUTOMATIC,
                             Gtk::PolicyType::POLICY_ALWAYS);
mScrollForResults.set_margin_top(10);
mScrollForResults.set_min_content_width(400);
mScrollForResults.set_min_content_height(200);
mScrollForResults.add(mTreeView);

//results treeView
mRefListStore = Gtk::ListStore::create(mColumns);
mTreeView.set_model(mRefListStore);
mTreeView.set_hexpand();
mTreeView.set_vexpand();
于 2016-05-01T21:40:11.590 に答える