Как активировать ячейку в виде дерева для редактирования
У меня есть простой вид дерева с текстовыми ячейками. Я хотел бы иметь возможность открыть текущую выбранную ячейку для редактирования, нажав клавишу 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);
}
2 ответа
Решение
Я нашел ответ. (Ключом к этому был пост под названием " Запустить редактирование ячеек PyGTK из кода".) Это тот же MWE, поведение которого я хочу:
#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;
Gtk::TreeModel::Path path;
Gtk::TreeViewColumn* col;
m_tree_view.get_cursor(path, col);
auto cell = col->get_first_cell();
// If the cell is being edited, cancel the editing;
// if the cell is not being edited, start editing.
if(cell->property_editing()) {
m_tree_view.set_cursor(path, *col, false);
} else {
m_tree_view.set_cursor(path, *col, true);
}
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);
}
Вы можете переключать редактируемые / не редактируемые с помощью клавиши F2 с помощью кода ниже.
bool on_key_press_event(GdkEventKey* event)
{
if (GDK_KEY_F2) {
cout << "F2 was pressed." << endl;
// What code should go here to make the currently selected cell active for editing?
Gtk::CellRendererText *column_fruit = (Gtk::CellRendererText*)m_tree_view.get_column_cell_renderer(0);
Gtk::CellRendererText *column_vegetable = (Gtk::CellRendererText*)m_tree_view.get_column_cell_renderer(1);
column_fruit->property_editable() = !column_fruit->property_editable();
column_vegetable->property_editable() = !column_vegetable->property_editable();
}
}