我有一个基于文本的单元格的简单树视图。我希望能够通过按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);
}
答案 0 :(得分:2)
我找到了答案。 (关键是帖子名为Start PyGTK cellrenderer edit from code。)这是相同的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);
}
答案 1 :(得分:0)
您可以通过以下代码使用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();
}
}