如何将 gtk::label 与目录中文件的创建或抑制同步?
how can I synchronize a gtk::label with the creation or suppression of a file in a directory?
我有一个程序可以列出工作目录中的所有文件(我使用 glib
来执行此操作),然后我在 GtkWindow
槽 Gtk::Label
中筛选此列表。我使用 run()
、
筛选 window
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "Zombie-Shadowchaser SixSixSix");
app->run(*pMainWindow);
我知道如何使用 set_label()
更改标签 我可以通过单击按钮将目录中的文件列表与筛选的列表同步。因此,如果我删除或创建一个文件,它会删除该文件或将其添加到标签中。但是如何让我的程序在不点击的情况下每秒同步一次呢?
这里有一个完整的例子,如果你想了解如何使用 g_signal_connect()
也很适合学习
#include <gtkmm.h>
Gtk::Label *plabel; // because I"m lazzy...
/**
** everytime a file is created in the current directory, toCallbackFunction()
** will be called. The paramaters are the same of signal see signal here :
** http://www.freedesktop.org/software/gstreamer-sdk/data/docs/latest/gio/GFileMonitor.html#GFileMonitor-changed
**/
void
toCallbackFunction(GFileMonitor *monitor
,GFile *file
,GFile *other_file
,GFileMonitorEvent event_type
,gpointer user_data
)
{
plabel->set_label( g_file_get_path(file) );
}
int
main(int argc
,char *argv[]
)
{
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base");
Gtk::Window window;
Gtk::Label label;
window.set_default_size(800, 200);
label.set_label("test");
window.add(label);
label.show();
plabel = &label;
/*
* g_file_monitor() requires a file, not a path. So we use g_file_new_for_path()
* to convert the directory (this is for demonstration)
*/
GFile *file = g_file_new_for_path(".");
GFileMonitor *monitor;
/*
* http://www.freedesktop.org/software/gstreamer-sdk/data/docs/latest/gio/GFile.html#g-file-monitor
*/
monitor = g_file_monitor_directory(file, G_FILE_MONITOR_NONE, nullptr, nullptr);
/*
* the next line, is how to connect the monitor to a callback function when
* the signal changed has been triggered.
*/
g_signal_connect(monitor, "changed", G_CALLBACK (toCallbackFunction), nullptr);
return app->run(window);
}
在 linux 上编译:
g++ main.cc -o simple `pkg-config gtkmm-3.0 --cflags --libs` -std=c++11
对于 MS Windows 用户,我不是种族主义者,但我不知道如何在 windows 上编译。任何评论都会受到赞赏,我自己制作了这段代码。感谢报告任何错误。
使用方法:
当您启动程序时,请在同一目录中使用您的控制台并创建一个新文件,例如,
$ echo "stack" > overflow
你应该得到类似的东西:
感谢 nemequ
我有一个程序可以列出工作目录中的所有文件(我使用 glib
来执行此操作),然后我在 GtkWindow
槽 Gtk::Label
中筛选此列表。我使用 run()
、
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "Zombie-Shadowchaser SixSixSix");
app->run(*pMainWindow);
我知道如何使用 set_label()
更改标签 我可以通过单击按钮将目录中的文件列表与筛选的列表同步。因此,如果我删除或创建一个文件,它会删除该文件或将其添加到标签中。但是如何让我的程序在不点击的情况下每秒同步一次呢?
这里有一个完整的例子,如果你想了解如何使用 g_signal_connect()
#include <gtkmm.h>
Gtk::Label *plabel; // because I"m lazzy...
/**
** everytime a file is created in the current directory, toCallbackFunction()
** will be called. The paramaters are the same of signal see signal here :
** http://www.freedesktop.org/software/gstreamer-sdk/data/docs/latest/gio/GFileMonitor.html#GFileMonitor-changed
**/
void
toCallbackFunction(GFileMonitor *monitor
,GFile *file
,GFile *other_file
,GFileMonitorEvent event_type
,gpointer user_data
)
{
plabel->set_label( g_file_get_path(file) );
}
int
main(int argc
,char *argv[]
)
{
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base");
Gtk::Window window;
Gtk::Label label;
window.set_default_size(800, 200);
label.set_label("test");
window.add(label);
label.show();
plabel = &label;
/*
* g_file_monitor() requires a file, not a path. So we use g_file_new_for_path()
* to convert the directory (this is for demonstration)
*/
GFile *file = g_file_new_for_path(".");
GFileMonitor *monitor;
/*
* http://www.freedesktop.org/software/gstreamer-sdk/data/docs/latest/gio/GFile.html#g-file-monitor
*/
monitor = g_file_monitor_directory(file, G_FILE_MONITOR_NONE, nullptr, nullptr);
/*
* the next line, is how to connect the monitor to a callback function when
* the signal changed has been triggered.
*/
g_signal_connect(monitor, "changed", G_CALLBACK (toCallbackFunction), nullptr);
return app->run(window);
}
在 linux 上编译:
g++ main.cc -o simple `pkg-config gtkmm-3.0 --cflags --libs` -std=c++11
对于 MS Windows 用户,我不是种族主义者,但我不知道如何在 windows 上编译。任何评论都会受到赞赏,我自己制作了这段代码。感谢报告任何错误。
使用方法:
当您启动程序时,请在同一目录中使用您的控制台并创建一个新文件,例如,
$ echo "stack" > overflow
你应该得到类似的东西:
感谢 nemequ