is it possible add
Entry box into ColumnView table column header?
Hi,
You can use Gtk.ColumnView.set_header_factory to generate the headers widget. Probably a Gtk.Entry in your case.
Thanks for reply, but I am not able make working sample for this method, can you help me?
What is wrong on this code:
#include <gtkmm.h>
#include
// Custom Gtk::ListItemFactory for the header
class HeaderFactory : public Gtk::SignalListItemFactory {
public:
HeaderFactory() {
signal_setup().connect([ ](const Glib::RefPtr<Gtk::ListItem>& list_item) {
// Use Gtk::make_managed for the box and its children.
// set_child() internally knows how to work with a Glib::RefPtr-managed object.
auto box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
box->append(*Gtk::make_managed<Gtk::Label>());
box->append(*Gtk::make_managed<Gtk::Image>());
list_item->set_child(*box);
});
signal_bind().connect([](const Glib::RefPtr<Gtk::ListItem>& list_item) {
auto header_widget = dynamic_cast<Gtk::Box*>(list_item->get_child());
if (!header_widget) return;
auto item = list_item->get_item();
auto column_view_column = dynamic_cast<Gtk::ColumnViewColumn*>(item.get());
if (!column_view_column) return;
auto children = header_widget->get_children();
if (children.empty()) return;
auto label = dynamic_cast<Gtk::Label*>(children[0]);
auto image = dynamic_cast<Gtk::Image*>(children[1]);
if (label && image) {
label->set_text(column_view_column->get_title());
if (column_view_column->get_title() == "Primary Key") {
image->set_from_icon_name("object-select-symbolic");
} else {
image->set_from_icon_name("");
}
}
});
}
};
class ExampleWindow : public Gtk::ApplicationWindow {
public:
ExampleWindow(BaseObjectType* cobj, const Glib::RefPtr<Gtk::Builder>& refBuilder);
private:
Gtk::ColumnView\* m_column_view;
};
ExampleWindow::ExampleWindow(BaseObjectType* cobj, const Glib::RefPtr<Gtk::Builder>& refBuilder)
: Gtk::ApplicationWindow(cobj)
{
m_column_view = refBuilder->get_widget<Gtk::ColumnView>(“column_view”);
auto list_model = Gtk::StringList::create();
list_model->append("0");
list_model->append("1");
list_model->append("2");
auto selection_model = Gtk::NoSelection::create(list_model);
m_column_view->set_model(selection_model);
auto primary_key_factory = Gtk::SignalListItemFactory::create();
auto apple_factory = Gtk::SignalListItemFactory::create();
auto banana_factory = Gtk::SignalListItemFactory::create();
auto setup_func = [](const Glib::RefPtr<Gtk::ListItem>& list_item) {
list_item->set_child(*Gtk::make_managed<Gtk::Label>());
};
primary_key_factory->signal_setup().connect(setup_func);
apple_factory->signal_setup().connect(setup_func);
banana_factory->signal_setup().connect(setup_func);
primary_key_factory->signal_bind().connect([](const Glib::RefPtr<Gtk::ListItem>& list_item) {
auto label = dynamic_cast<Gtk::Label*>(list_item->get_child());
if (!label) return;
auto string_object = dynamic_cast<Gtk::StringObject*>(list_item->get_item().get());
if (!string_object) return;
label->set_label(string_object->get_string());
});
// ... (Remaining bind functions)
auto header_factory = Glib::make_refptr_for_instance<HeaderFactory>(new HeaderFactory());
m_column_view->set_header_factory(header_factory);
m_column_view->append_column(Gtk::ColumnViewColumn::create("Primary Key", primary_key_factory));
m_column_view->append_column(Gtk::ColumnViewColumn::create("Apple", apple_factory));
m_column_view->append_column(Gtk::ColumnViewColumn::create("Banana", banana_factory));
}
int main(int argc, char** argv) {
auto application = Gtk::Application::create(“org.gtkmm.example”);
application->signal_activate().connect([&application]() {
auto builder = Gtk::Builder::create_from_file("columnview.ui");
auto window = Gtk::Builder::get_widget_derived<ExampleWindow>(builder, "example_window");
if (window) {
application->add_window(*window);
window->show();
}
});
return application->run(argc, argv);
}
this work for me:
#include <gtkmm.h>
#includeclass MyWindow : public Gtk::Window
{
public:
MyWindow();protected:
void on_button_click();private:
Gtk::Box m_main_box;
Gtk::Button m_button;
Gtk::ScrolledWindow m_scrolled_window;
Gtk::TreeView m_tree_view;// Model dat class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_number); add(m_col_description); } Gtk::TreeModelColumn<Glib::ustring> m_col_number; Gtk::TreeModelColumn<Glib::ustring> m_col_description; }; ModelColumns m_columns;};
MyWindow::MyWindow() :
m_main_box(Gtk::Orientation::VERTICAL, 5),
m_button(“ZavĹ™Ăt”)
{
set_title(“PĹ™Ăklad Gtk::TreeView”);
set_default_size(400, 300);
set_child(m_main_box);// VytvoĹ™enĂ a nastavenĂ modelu auto ref_list_store = Gtk::ListStore::create(m_columns); m_tree_view.set_model(ref_list_store); // PĹ™idánĂ dat do modelu Gtk::TreeIter iter = ref_list_store->append(); iter->set_value(m_columns.m_col_number, Glib::ustring("101")); iter->set_value(m_columns.m_col_description, Glib::ustring("PrvnĂ poloĹľka")); iter = ref_list_store->append(); iter->set_value(m_columns.m_col_number, Glib::ustring("102")); iter->set_value(m_columns.m_col_description, Glib::ustring("Druhá poloĹľka")); iter = ref_list_store->append(); iter->set_value(m_columns.m_col_number, Glib::ustring("103")); iter->set_value(m_columns.m_col_description, Glib::ustring("TĹ™etĂ poloĹľka")); // VytvoĹ™enĂ vlastnĂho widgetu pro záhlavĂ sloupce auto header_box = Gtk::manage(new Gtk::Box(Gtk::Orientation::VERTICAL, 5)); auto header_entry = Gtk::manage(new Gtk::Entry()); auto header_label = Gtk::manage(new Gtk::Label("ID PoloĹľky")); header_box->append(*header_label); header_box->append(*header_entry); // VytvoĹ™enĂ sloupce TreeView auto column = Gtk::manage(new Gtk::TreeViewColumn()); // NastavenĂ vlastnĂho widgetu jako záhlavĂ sloupce column->set_widget(*header_box); // PĹ™idánĂ rendereru pro text auto renderer_text = Gtk::manage(new Gtk::CellRendererText()); column->pack_start(*renderer_text, true); column->add_attribute(*renderer_text, "text", m_columns.m_col_number); m_tree_view.append_column(*column); // VytvoĹ™enĂ druhĂ©ho sloupce pro popis auto renderer_description = Gtk::manage(new Gtk::CellRendererText()); auto column_description = Gtk::manage(new Gtk::TreeViewColumn("Popis", *renderer_description)); column_description->add_attribute(*renderer_description, "text", m_columns.m_col_description); m_tree_view.append_column(*column_description); m_scrolled_window.set_child(m_tree_view); m_scrolled_window.set_vexpand(true); m_main_box.append(m_scrolled_window); m_main_box.append(m_button); m_button.signal_clicked().connect(sigc::mem_fun(*this, &MyWindow::on_button_click));}
void MyWindow::on_button_click()
{
close();
}int main(int argc, char* argv)
{
auto app = Gtk::Application::create(“org.gtkmm.example”);
return app->make_window_and_run(argc, argv);
}
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.