如何在树视图中激活单元格以进行编辑

时间:2014-09-01 14:57:23

标签: c++ gtk gtkmm

我有一个基于文本的单元格的简单树视图。我希望能够通过按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 个答案:

答案 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();
    }
}