Gtkmm ListStore,如何在其中一行中捕获该值已更改?

Posted

技术标签:

【中文标题】Gtkmm ListStore,如何在其中一行中捕获该值已更改?【英文标题】:Gtkmm ListStore, how to catch that value in one of the rows was changed? 【发布时间】:2017-09-28 19:44:50 【问题描述】:

当表格中的某些值发生变化时,我需要重绘图像。我想知道如何捕捉表中值的变化。 我找到了 signal_row_changed,但它给出了 const Gtk::TreeModel::Path& 和 const Gdk::TreeModel::iterator&。 当我做这样的事情时:

...
void PrMainWindow::redraw()...
...
nRefTree->signal_row_changed().connect
    (sigc::mem_fun(*this,
                  &PrMainWindow::redraw));

哪里 nRefTree - Glib::Refptr,编译器给我错误。 但是,如果我这样做了

void PrMainWindow::redraw(
    const Gtk::TreeModel::Path& path,
    const Gtk::TreeModel::iterator& iter)
...

它确实有效,但我不需要这些引用,因为可以从其他地方调用此函数并且无需这些参数。

也许有一些其他的信号或削减无用参数的方法?请帮忙。

【问题讨论】:

【参考方案1】:

最简单的方法是从连接的信号 fun 中调用 redraw:

nRefTree->signal_row_changed().connect(sigc::mem_fun(*this, &PrMainWindow::MyChangedSignal));

void PrMainWindow::MyChangedSignal(const Gtk::TreeModel::Path& path, const Gtk::TreeModel::iterator& iter)

    ...
    redraw();

所以redraw()也可以从其他地方调用。


我能想象的(未经测试)的棘手方法是:

使用gobj()获取底层GtkListStore* GtkListStore 实现了GtkTreeModel,所以它的所有方法都可用。

我假设您可以将回调连接到 GtkTreeModel 的“行更改”信号。这个回调使用的是指针而不是引用,所以可以从其他地方不带参数地调用它。

【讨论】:

看起来……很奇怪,但我认为,它会起作用的。谢谢!

以上是关于Gtkmm ListStore,如何在其中一行中捕获该值已更改?的主要内容,如果未能解决你的问题,请参考以下文章

如何从gtkmm树视图中获取所选行

带有 gtkmm 的 Glade 构建的 TreeView

gtkmm 树模型添加行

如何将 ComboBox 添加到 TreeView 列?

是否可以指示 `Gtk::TreeView` 显示自定义类型?

如何使用 gtkmm 在 TreeView 中使单个项目变为粗体?