C 是否可以刷新/更新树视图中的数据?
我是GUI开发的新手,我已经在gtk+3项目上工作了几天,但我被困在这一点上 我的应用程序包含两个TreeView,行中的数据是通过sql查询获得的,通过右键单击行,弹出菜单出现,提供将数据设置为“已知”的选项,更新数据库表 以前的数据现在应该属于另一个treeview,当应用程序重新启动时也是如此,但我希望能够实时完成 是否可以更新/刷新树视图中的数据 通过以下函数获得模型:C 是否可以刷新/更新树视图中的数据?,c,treeview,refresh,gtk3,C,Treeview,Refresh,Gtk3,我是GUI开发的新手,我已经在gtk+3项目上工作了几天,但我被困在这一点上 我的应用程序包含两个TreeView,行中的数据是通过sql查询获得的,通过右键单击行,弹出菜单出现,提供将数据设置为“已知”的选项,更新数据库表 以前的数据现在应该属于另一个treeview,当应用程序重新启动时也是如此,但我希望能够实时完成 是否可以更新/刷新树视图中的数据 通过以下函数获得模型: static GtkTreeStore* create_and_fill(char* known) { GtkTr
static GtkTreeStore* create_and_fill(char* known)
{
GtkTreeStore* store;
GtkTreeIter iter;
GtkWidget* tree;
store = gtk_tree_store_new(2,G_TYPE_STRING,G_TYPE_STRING);
char source_mac[50] = {0};
char source_ip[50] = {0};
int num_fields;
char query[300] = {0};
sprintf(query, "select mac,ip from hosts where known=%s", known);
if(mysql_query(conn, query))
{
fprintf(stderr,"%s\n", mysql_error(conn));
}
res = mysql_store_result(conn);
num_fields = mysql_num_fields(res);
while((row = mysql_fetch_row(res)))
{
sprintf(source_mac,"%s", row[0]);
sprintf(source_ip,"%s", row[1]);
gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter, MAC_ADDRESS, source_mac, IP_ADDRESS, source_ip,-1);
}
gtk_tree_store_append(store, &iter, NULL);
mysql_free_result(res);
return store;
}
我从未使用过
gtk_tree_store
,只使用了gtk_list_store
。然而,该逻辑也应适用于gtk_tree_存储
根据新SQL查询的结果,可能会更改、添加或删除某些条目
更新视图基本上有两种方法
如果可以在表中添加和删除行,最简单的方法可能是清理整个树并再次填充它
GtkTreeIter iter;
gboolean iter_valid;
iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
while (iter_valid)
{
// Maybe additional cleanup of related data
// gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, .... -1);
iter_valid = gtk_tree_store_remove(store, &iter);
}
// Maybe update filtering and sorting afterwards
gtk_tree_model_filter_refilter(store_filtered);
// Populate again with result of SQL query.
如果您可以确保只有内容更改,那么您可以在存储器中更改它:
GtkTreeIter iter;
gboolean iter_valid;
iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
while (iter_valid)
{
gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, < add fields here >, -1);
bool update = FALSE;
// Check if this entry needs to be updated
// .... => set update = TRUE;
if (update)
gtk_tree_store_set(store, &iter, < field names and values here... > -1);
iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
}
// Optionally update filtering and sorting...
GtkTreeIter-iter;
gboolean iter_有效;
iter_valid=gtk_tree_model_get_iter_first(gtk_tree_model(store)和iter);
while(iter_有效)
{
gtk_tree_model_get(gtk_tree_model(store),&iter,,-1);
bool update=FALSE;
//检查是否需要更新此条目
//....=>设置更新=真;
如果(更新)
gtk树存储集(存储和iter,<此处的字段名称和值…>-1);
iter_valid=gtk_tree_model_iter_next(gtk_tree_model(store)和iter);
}
//可选更新筛选和排序。。。
我从未使用过gtk_tree_store
,但只使用了gtk_list_store
。然而,该逻辑也应适用于gtk_tree_存储
根据新SQL查询的结果,可能会更改、添加或删除某些条目
更新视图基本上有两种方法
如果可以在表中添加和删除行,最简单的方法可能是清理整个树并再次填充它
GtkTreeIter iter;
gboolean iter_valid;
iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
while (iter_valid)
{
// Maybe additional cleanup of related data
// gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, .... -1);
iter_valid = gtk_tree_store_remove(store, &iter);
}
// Maybe update filtering and sorting afterwards
gtk_tree_model_filter_refilter(store_filtered);
// Populate again with result of SQL query.
如果您可以确保只有内容更改,那么您可以在存储器中更改它:
GtkTreeIter iter;
gboolean iter_valid;
iter_valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
while (iter_valid)
{
gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, < add fields here >, -1);
bool update = FALSE;
// Check if this entry needs to be updated
// .... => set update = TRUE;
if (update)
gtk_tree_store_set(store, &iter, < field names and values here... > -1);
iter_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
}
// Optionally update filtering and sorting...
GtkTreeIter-iter;
gboolean iter_有效;
iter_valid=gtk_tree_model_get_iter_first(gtk_tree_model(store)和iter);
while(iter_有效)
{
gtk_tree_model_get(gtk_tree_model(store),&iter,,-1);
bool update=FALSE;
//检查是否需要更新此条目
//....=>设置更新=真;
如果(更新)
gtk树存储集(存储和iter,<此处的字段名称和值…>-1);
iter_valid=gtk_tree_model_iter_next(gtk_tree_model(store)和iter);
}
//可选更新筛选和排序。。。
我只是做了一个丑陋的补丁。
我创建了一个函数,用于删除TreeView、重建存储并再次打包它们
static void refresh()
{
gtk_container_remove(GTK_CONTAINER(box), tree_1);
gtk_container_remove(GTK_CONTAINER(box), tree_2);
tree_1 = create_view(create_and_fill("true")); // Rebuild the stores and views
tree_2 = create_view(create_and_fill("false"));
gtk_box_pack_start(GTK_BOX(box),tree_1,FALSE,FALSE,0);
gtk_box_pack_start(GTK_BOX(box),tree_2,FALSE,FALSE,0);
gtk_box_reorder_child(GTK_BOX(box), tree_1, x); // X being the relative position of your treeview
gtk_box_reorder_child(GTK_BOX(box), tree_2, x);
gtk_widget_show_all(box);
}
我只是做了一个丑陋的补丁。 我创建了一个函数,用于删除TreeView、重建存储并再次打包它们
static void refresh()
{
gtk_container_remove(GTK_CONTAINER(box), tree_1);
gtk_container_remove(GTK_CONTAINER(box), tree_2);
tree_1 = create_view(create_and_fill("true")); // Rebuild the stores and views
tree_2 = create_view(create_and_fill("false"));
gtk_box_pack_start(GTK_BOX(box),tree_1,FALSE,FALSE,0);
gtk_box_pack_start(GTK_BOX(box),tree_2,FALSE,FALSE,0);
gtk_box_reorder_child(GTK_BOX(box), tree_1, x); // X being the relative position of your treeview
gtk_box_reorder_child(GTK_BOX(box), tree_2, x);
gtk_widget_show_all(box);
}
我刚刚为一个点对点公告板编写了一些代码,它既可以填充一个新的树,也可以将新行附加到一个已经填充的树上。它使用递归函数获取树中现有的迭代器。捕获迭代器的数组通过引用传递到此函数。索引0处的迭代器为null,顶级post的“inReplyTo”字段为0 为了简洁起见,这里我只展示相关代码。请注意,对updateTree的第一个调用使用$data中的行填充裸树,然后第二个调用附加$more中的行
<?php
$model = new GtkTreeStore(GObject::TYPE_STRING, GObject::TYPE_LONG);
$tree = new GtkTreeView($model);
$renderer1 = new GtkCellRendererText();
$column1 = new GtkTreeViewColumn('Title', $renderer1, 'text', 0);
$renderer2 = new GtkCellRendererText();
$column2 = new GtkTreeViewColumn('ID', $renderer2, 'text', 1);
$tree->append_column($column1);
$tree->append_column($column2);
function getTreeIterators($model, &$iters, $iter = null)
{
if ($iter === null) {
$iter = $model->get_iter_first();
}
while ($iter !== null) {
$cols = $model->get($iter, 1);
$id = $cols[0];
$iters[$id] = $iter;
if ($model->iter_has_child($iter)) {
$child = $model->iter_children($iter);
getTreeIterators($model, $iters, $child);
}
$iter = $model->iter_next($iter);
}
} // getTreeIterators
function updateTree($treeView, $data)
{
$model = $treeView->get_model();
$iters = array();
$iters[0] = null;
getTreeIterators($model, $iters);
foreach($data as $item) {
$iters[$item->id] = $model->append($iters[$item->inReplyTo], array($item->title, $item->id));
}
$tree->expand_all();
} // updateTree
$data = array(
(object) array('id' => 1, 'inReplyTo' => 0, 'title' => 'First post'),
(object) array('id' => 2, 'inReplyTo' => 1, 'title' => 'Re: First post'),
(object) array('id' => 3, 'inReplyTo' => 0, 'title' => 'Second post'),
(object) array('id' => 4, 'inReplyTo' => 2, 'title' => 'Re: Re: First post'),
(object) array('id' => 5, 'inReplyTo' => 3, 'title' => 'Re: Second post'),
(object) array('id' => 6, 'inReplyTo' => 0, 'title' => 'Third post')
);
$more = array(
(object) array('id' => 7, 'inReplyTo' => 0, 'title' => 'Fourth post'),
(object) array('id' => 8, 'inReplyTo' => 1, 'title' => 'Re: That first post'),
(object) array('id' => 9, 'inReplyTo' => 5, 'title' => 'Re: Re: Second post')
);
updateTree($tree, $data);
updateTree($tree, $more);
?>
我刚刚为一个点对点公告板编写了一些代码,它既可以填充一个新树,也可以向已经填充的树追加新行。它使用递归函数获取树中现有的迭代器。捕获迭代器的数组通过引用传递到此函数。索引0处的迭代器为null,顶级post的“inReplyTo”字段为0 为了简洁起见,这里我只展示相关代码。请注意,对updateTree的第一个调用使用$data中的行填充裸树,然后第二个调用附加$more中的行
<?php
$model = new GtkTreeStore(GObject::TYPE_STRING, GObject::TYPE_LONG);
$tree = new GtkTreeView($model);
$renderer1 = new GtkCellRendererText();
$column1 = new GtkTreeViewColumn('Title', $renderer1, 'text', 0);
$renderer2 = new GtkCellRendererText();
$column2 = new GtkTreeViewColumn('ID', $renderer2, 'text', 1);
$tree->append_column($column1);
$tree->append_column($column2);
function getTreeIterators($model, &$iters, $iter = null)
{
if ($iter === null) {
$iter = $model->get_iter_first();
}
while ($iter !== null) {
$cols = $model->get($iter, 1);
$id = $cols[0];
$iters[$id] = $iter;
if ($model->iter_has_child($iter)) {
$child = $model->iter_children($iter);
getTreeIterators($model, $iters, $child);
}
$iter = $model->iter_next($iter);
}
} // getTreeIterators
function updateTree($treeView, $data)
{
$model = $treeView->get_model();
$iters = array();
$iters[0] = null;
getTreeIterators($model, $iters);
foreach($data as $item) {
$iters[$item->id] = $model->append($iters[$item->inReplyTo], array($item->title, $item->id));
}
$tree->expand_all();
} // updateTree
$data = array(
(object) array('id' => 1, 'inReplyTo' => 0, 'title' => 'First post'),
(object) array('id' => 2, 'inReplyTo' => 1, 'title' => 'Re: First post'),
(object) array('id' => 3, 'inReplyTo' => 0, 'title' => 'Second post'),
(object) array('id' => 4, 'inReplyTo' => 2, 'title' => 'Re: Re: First post'),
(object) array('id' => 5, 'inReplyTo' => 3, 'title' => 'Re: Second post'),
(object) array('id' => 6, 'inReplyTo' => 0, 'title' => 'Third post')
);
$more = array(
(object) array('id' => 7, 'inReplyTo' => 0, 'title' => 'Fourth post'),
(object) array('id' => 8, 'inReplyTo' => 1, 'title' => 'Re: That first post'),
(object) array('id' => 9, 'inReplyTo' => 5, 'title' => 'Re: Re: Second post')
);
updateTree($tree, $data);
updateTree($tree, $more);
?>
请向我们展示您当前在该主题上的努力。到目前为止你尝试了什么。用于存储数据的模型。请向我们展示您当前在该主题上的工作。到目前为止你尝试了什么。哪个模型用于存储数据。