2016-04-23 30 views
4

我無法正確獲取GTK3中的TreeView。在GTK3樹視圖中包裝文本

我把它用這種方式來包裝:

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。

編輯:在標題中的固定錯字...

+1

哦,我的......我從來不想觸摸任何人的感受。 :) – kracejic

回答

4

最後我發現如何做到這一點。

在窗口的設置中(對於我的窗口派生類的構造函數),需要將列設置爲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; 
    } 
}); 

也許值得注意的是,我已將mTreeView封裝在Gtk :: ScrolledWindow中。所以這是一個在柱子設置之前出現的塊。 :)

//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();