У меня есть простое древовидное представление с текстовыми ячейками. Я хотел бы иметь возможность открыть текущую выбранную ячейку для редактирования, нажав клавишу F2. Другими словами, клавиша F2 должна вести себя точно так же, как клавиша Enter сейчас, когда выбрана ячейка. (Открывается маленькое поле, в котором я могу редактировать содержимое ячейки.)
Я не мог понять, что звонить, чтобы активировать эту маленькую коробочку.
Я включаю минимальный рабочий пример:
#include <gtkmm.h>
#include <iostream>
typedef Glib::RefPtr<Gtk::Application> ApplicationRef;
typedef Glib::RefPtr<Gtk::ListStore> ListStoreRef;
using namespace std;
class Example : public Gtk::Window
{
public:
Example()
{
m_list_store_ref = Gtk::ListStore::create(m_model_columns);
m_tree_view.set_model(m_list_store_ref);
// Fill in the model with dummy data.
m_add_row("apple", "lettuce");
m_add_row("orange", "broccoli");
m_add_row("banana", "cauliflower");
// Add columns to the tree view.
m_tree_view.append_column_editable("Fruit", m_model_columns.m_fruit);
m_tree_view.append_column_editable("Vegetables", m_model_columns.m_vegetables);
add(m_tree_view);
add_events(Gdk::KEY_PRESS_MASK);
show_all_children();
}
virtual ~Example() {}
protected:
//Signal handlers:
void on_button_clicked() { hide(); }
//Member widgets:
Gtk::TreeView m_tree_view;
// Other objects
ListStoreRef m_list_store_ref;
// Model columns
class ModelColumns : public Gtk::TreeModel::ColumnRecord
{
public:
ModelColumns() { add(m_fruit); add(m_vegetables); }
Gtk::TreeModelColumn<Glib::ustring> m_fruit;
Gtk::TreeModelColumn<Glib::ustring> m_vegetables;
};
ModelColumns m_model_columns;
void m_add_row(Glib::ustring fruit, Glib::ustring vegetable)
{
auto row = *(m_list_store_ref->append());
row[m_model_columns.m_fruit] = fruit;
row[m_model_columns.m_vegetables] = vegetable;
}
bool on_key_press_event(GdkEventKey* event)
{
if (event->keyval==GDK_KEY_F2) {
cout << "F2 was pressed." << endl;
// What code should go here to make the currently selected cell active for editing?
return true;
}
return Gtk::Window::on_key_press_event(event);
}
};
int main(int argc, char *argv[])
{
ApplicationRef app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.mwe");
Example example;
return app->run(example);
}