如何激活树状图中的单元格进行编辑

How to activate a cell in tree view for editing

本文关键字:单元格 编辑 何激活 激活      更新时间:2023-10-16

我有一个简单的树视图,其中包含基于文本的单元格。我希望能够通过按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);
}
我找到了答案。(关键是标题为"从代码开始PyGTK cellrenderer编辑"的帖子。)这是相同的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();
    }
}