我试图在计算正在进行时显示一个 Gtk::Spinner 对象,但似乎没有发生任何事情。代码片段看起来像......
{
Gtk::Spinner spinner;
spinner.start ();
// do some work...
spinner.stop ();
}
我原以为微调器需要知道它出现在哪个对话上,但我看不到任何将其输入对象的方法。有谁知道我在哪里可以找到一个有效的例子?我可以在很多地方找到 Gtk 文档,但这并没有多大帮助。
你打电话了吗
spinner.show ();
并将其添加到某个窗口?
此外,您的计算可能会阻塞 UI,因此不会更新。称呼
while (Gtk::Main::events_pending ())
Gtk::Main::iteration ();
偶尔。
简而言之,如果Gtk::Spinner没有出现在屏幕上,这里有一个快速清单:
vbox.pack_start(spinner, Gtk::PACK_SHRINK);
show_all_children();
spinner.start()
小部件实际出现并在屏幕上旋转。详细地:
实际的 Gtk 微调器小部件代码(请参阅 gtkspinner.c 中的函数gtk_spinner_class_init ( ))不会自行进行任何绘图。事实上它的代码很少。它所做的只是将 CSS 代码添加到 gtk 小部件:
因此,实际外观(图标)和动画由您当前主题的 CSS 文件定义。例如,在 Gtk 的默认主题的gtk-contained.css文件中,您会发现以下内容:
spinner {
background: none;
opacity: 0;
-gtk-icon-source: -gtk-icontheme("process-working-symbolic");
};
这意味着它将自动在主题的“icons”目录树中搜索具有基本名称“ process-working-symbolic ”的适当图像文件。实际的旋转动画是在同一个 CSS 文件中定义的:
spinner:checked {
opacity: 1;
animation: spin 1s linear infinite;
};
在大多数其他主题中,微调器小部件的这些 CSS 代码部分几乎相同。
现在这是一个常见的问题:在大多数主题中,微调器图像是一个 SVG 文件(例如,通常是“ process-working-symbolic.svg ”),但是 Gdk pixbuf 加载器根本不支持 SVG 格式。它们支持多种其他图像文件格式,但要真正允许 Gdk/Gtk 加载 .svg 文件,您需要安装能够执行此操作的第三方 pixbuf 加载器,例如librsvg。
选择:
如果您不能或不想安装支持 SVG 的 Gdk pixbuf 加载程序,例如librsvg,那么您也可以简单地添加具有相同基本名称的图像文件,但采用另一种文件格式,如“ process-working- symbolic.png "到你的主题的图标目录树。因此,要么绘制或下载一些微调器图片,然后对其进行缩放并将它们多次放置到主题的“图标”目录中列出的分辨率,例如:
/THEMEDIR/icons/8x8/status/process-working-symbolic.png
/THEMEDIR/icons/16x16/status/process-working-symbolic.png
/THEMEDIR/icons/22x22/status/process-working-symbolic.png
/THEMEDIR/icons/24x24/status/process-working-symbolic.png
/THEMEDIR/icons/32x32/status/process-working-symbolic.png
/THEMEDIR/icons/64x64/status/process-working-symbolic.png
/THEMEDIR/icons/256x256/status/process-working-symbolic.png
/THEMEDIR/icons/512x512/status/process-working-symbolic.png
您还应该知道:每当您执行spinner.start()
此操作时,微调器图标会立即出现在屏幕上,但即使在一台不错的机器上,微调器开始动画之前通常也需要将近一秒钟的时间。
要将鼠标光标更改为“忙碌”,您可以执行以下操作:
Glib::RefPtr<Gdk::Window> window = dialog.get_window();
if(window) {
window->set_cursor(Gdk::Cursor(Gdk::WATCH));
Gdk::flush();
}
要将其改回,请执行
window->set_cursor();
反而。
免责声明:我通常在 C 中使用 GTK,并在运行中翻译了这个......