这是对此的后续问题: How do I add a ComboBox to a TreeView column?
我能够将一个ComboBox放在TreeView中,并提供我需要的选项。但我似乎无法弄清楚如何将信号处理程序连接到它。所有现有文档都显示了如下连接语句:
m_Combo.signal_changed().connect(sigc::mem_fun(*this, &ExampleWindow::on_combo_changed) );
但我不在Window类定义中,因此没有*这个对象。我正在使用Glade创建GUI的基本结构。
此外,所有现有文档都显示信号处理程序执行以下操作:
void ExampleWindow::on_combo_changed()
{
Glib::ustring text = m_Combo.get_active_text();
if(!(text.empty()))
std::cout << "Combo changed: " << text << std::endl;
}
“m_Combo”对象是全局的,只需简单访问即可。但是当ComboBox在TreeView中时,它是动态的。我将如何实际访问ComboBox?通过参数传递一些东西? signal_changed()。connect()函数似乎对其参数非常挑剔。无论我给它什么,它在编译器错误中吐出(字面上)100行乱码。结束于:
/usr/include/sigc++-2.0/sigc++/functors/mem_fun.h:6196:1: note: template<class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5, class T_arg6, class T_arg7, class T_return, class T_obj, class T_obj2> sigc::bound_const_volatile_mem_functor7<T_return, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7> sigc::mem_fun(T_obj&, T_return (T_obj2::*)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7)const volatile)
make: *** [src/RTT_Client_GTK.o] Error 1`
没有让我的生活更容易调试。
答案 0 :(得分:2)
首先,如果您使用Glade创建UI,则可能意味着您正在使用Gtk :: Builder加载它(因为Glade不再支持其旧的.glade格式)。 Gtk :: Builder有一个get_widget_derived()函数,允许您将GtkBuilder .xml文件中的小部件直接提取到派生的小部件类中。
其次,如果您使用的是TreeView,则不会直接使用ComboBox,而是使用CellRendererCombo。你可以这样做:
Gtk::CellRendererCombo *combo = manage (new Gtk::CellRendererCombo);
combo->signal_changed ().connect (sigc::mem_fun (*this, &ExampleWindow::on_combo_changed);
Gtk::TreeViewColumn *column = manage (new Gtk::TreeViewColumn ("Title", *combo));
column->add_attribute (*combo, "model", model_column_record.combo_model);
column->add_attribute (*combo, "text-column", model_column_record.combo_text_column);
treeview.append_column (*column);