Как активировать ячейку в дереве для редактирования

У меня есть простое древовидное представление с текстовыми ячейками. Я хотел бы иметь возможность открыть текущую выбранную ячейку для редактирования, нажав клавишу 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);
}

person AthanasiusOfAlex    schedule 01.09.2014    source источник


Ответы (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);
}
person AthanasiusOfAlex    schedule 02.09.2014

Вы можете переключать редактируемый / нередактируемый с помощью клавиши 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();
    }
}
person Wataru    schedule 02.09.2014
comment
Не совсем то, что мне было нужно. Мне нужно, чтобы он был не редактируемым, а в активном состоянии редактирования (как если бы я нажал Enter). - person AthanasiusOfAlex; 02.09.2014
comment
О, извините, у меня нет краткой идеи. Получить столбец фокуса сложно, необходимо вычислить координату указателя. - person Wataru; 02.09.2014
comment
Другим ресурсом для этого является en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View. /. - person AthanasiusOfAlex; 06.09.2014