如何将 ComboBox 添加到 TreeView 列?

Posted

技术标签:

【中文标题】如何将 ComboBox 添加到 TreeView 列?【英文标题】:How do I add a ComboBox to a TreeView column? 【发布时间】:2011-12-30 06:48:59 【问题描述】:

在 Gtkmm 中,我想要一个带有 ListStore 的 Gtk TreeView,并且列表中的一列是 ComboBoxText。但我似乎无法弄清楚该怎么做。

我现在的样子:

class PlayerListColumns : public Gtk::TreeModelColumnRecord

public:

    PlayerListColumns()
     add(name); add(team);

    TreeModelColumn<string> name;
    TreeModelColumn<ComboBoxText*> team;

然后在设置TreeView时(player_list_view对象)

PlayerListColumns *columns = new PlayerListColumns();
Glib::RefPtr<ListStore> refListStore = ListStore::create(*columns);
player_list_view->set_model(refListStore);

ComboBoxText *box = manage(new ComboBoxText());
box->append("Blah");
box->append("Blah");
box->append("Blah");

TreeModel::Row row = *(refListStore->append());
row[columns->name] = "My Name";
row[columns->team] = box;

“名称”列显示得很好,但没有组合框。我几乎可以肯定,仅仅将一个指向组合框的指针作为列类型是错误的,但我不知道它应该如何进行。我确实收到 GTK 警告:

GLib-GObject-WARNING **:无法从 `GtkComboBoxText' 类型的值设置属性 text' of typegchararray'

这似乎表明(来自一小部分谷歌搜索)非基本类型没有默认渲染器。但是,如果这是问题所在,我还没有找到任何有关如何设置的示例。所有的教程都只展示了原始数据类型的 TreeView。

有人知道如何将 ComboBox 放入 TreeView 中吗?

【问题讨论】:

【参考方案1】:

好的,我还没有让它 100% 工作,但是这个示例类应该让你走上正轨: http://svn.gnome.org/svn/gtkmm-documentation/trunk/examples/book/treeview/combo_renderer/

基本上,您需要将Gtk::TreeModelColumn&lt;Glib::RefPtr&lt;Gtk::ListStore&gt; &gt; 添加到您的列类中,并添加一个Gtk::TreeModelColumn&lt;string&gt; 来保存选定的数据。

然后,要使列成为组合框,您必须添加:

//manually created column for the tree view
Gtk::TreeViewColumn* pCol = Gtk::manage(new Gtk::TreeViewColumn("Choose"));

//the combobox cell renderer
Gtk::CellRendererCombo* comboCell = Gtk::manage(new Gtk::CellRendererCombo);

//pack the cell renderer into the column
pCol->pack_start(*comboCell);

//append the column to the tree view
treeView->append_column(*pCol);

//this sets the properties of the combobox and cell
//my gtkmm seems to be set for Glibmm properties
#ifdef GLIBMM_PROPERTIES_ENABLED
   pCol->add_attribute(comboCell->property_text(), columns->team);

   //this is needed because you can't use the ComboBoxText shortcut
   // you have to create a liststore and fill it with your strings separately
   // from your main model
   pCol->add_attribute(comboCell->property_model(), columns->teams);

   comboCell->property_text_column() = 0;
   comboCell->property_editable() = true;
#else
   pCol->add_attribute(*comboCell, "text", columns->team);
   pCol->add_attribute(*comboCell, "model", columns->teams);
   comboCell->set_property(text_column:, 0);
   comboCell->set_property("editable", true);
#endif

//connect a signal so you can set the selected option back into the model
//you can just have a column that is not added to the view if you want
comboCell->signal_edited()
    .connect(sigc::mem_fun(*this,&ComboWindow::on_combo_choice_changed));

在上面编辑

我认为使用Gtk::CellRendererCombo* 的方式是在您的PlayerListColumns 中使用的方法

http://developer.gnome.org/gtkmm/stable/classGtk_1_1CellRendererCombo.html

(我还没有进行工作测试,但我的想法来自: http://developer.gnome.org/gtkmm-tutorial/unstable/sec-treeview.html.en#treeview-cellrenderer-details)

【讨论】:

以上是关于如何将 ComboBox 添加到 TreeView 列?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 编程 自定义combobx控件,将treeview控件嵌入combobox中

WPF ComboBox下拉绑定Treeview 功能的实现

如何将“空”选择添加到 ComboBox?

c#怎么用comboBox绑定treeview控件

如何将图像工具提示添加到 JavaFX 中的 ComboBox 项?

如何将通用项目添加到绑定到 WPF 中的集合的 ComboBox