1

我试图在计算正在进行时显示一个 Gtk::Spinner 对象,但似乎没有发生任何事情。代码片段看起来像......

{
    Gtk::Spinner spinner;
    spinner.start (); 
    // do some work...
    spinner.stop ();
}

我原以为微调器需要知道它出现在哪个对话上,但我看不到任何将其输入对象的方法。有谁知道我在哪里可以找到一个有效的例子?我可以在很多地方找到 Gtk 文档,但这并没有多大帮助。

4

3 回答 3

2

你打电话了吗

spinner.show ();

并将其添加到某个窗口?

此外,您的计算可能会阻塞 UI,因此不会更新。称呼

while (Gtk::Main::events_pending ())
    Gtk::Main::iteration ();

偶尔。

于 2010-07-21T15:40:19.760 回答
2

简而言之,如果Gtk::Spinner没有出现在屏幕上,这里有一个快速清单:

  1. 确保已安装librsvg
  2. 检查您当前活动的 Gtk 主题是否有一个基本名称为“ process-working-symbolic ”的图像文件(例如 /path/to/your/theme/ icons/scalable-up-to-32/status/process-working-symbolic. svg)。
  3. 在您的应用程序代码中:确保将微调器对象添加到某些父小部件/容器中:vbox.pack_start(spinner, Gtk::PACK_SHRINK);
  4. 在您的应用代码中:确保所有小部件实际上都可见:show_all_children();
  5. 在您的应用程序代码中:最后,您需要调用spinner.start()小部件实际出现并在屏幕上旋转。

详细地:

实际的 Gtk 微调器小部件代码(请参阅 gtkspinner.c 中的函数gtk_spinner_class_init ( ))不会自行进行任何绘图。事实上它的代码很少。它所做的只是将 CSS 代码添加到 gtk 小部件:

  • 它将CSS 类微调器”分配给小部件
  • 并且每当小部件的布尔gtk 属性active ”更改时,它会自动添加和删除CSS 伪类checked ”。

因此,实际外观(图标)和动画由您当前主题的 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()此操作时,微调器图标会立即出现在屏幕上,但即使在一台不错的机器上,微调器开始动画之前通常也需要将近一秒钟的时间。

于 2019-12-27T18:58:26.617 回答
1

要将鼠标光标更改为“忙碌”,您可以执行以下操作:

Glib::RefPtr<Gdk::Window> window = dialog.get_window();
if(window) {
    window->set_cursor(Gdk::Cursor(Gdk::WATCH));
    Gdk::flush();
}

要将其改回,请执行

window->set_cursor();

反而。

免责声明:我通常在 C 中使用 GTK,并在运行中翻译了这个......

于 2010-07-21T17:19:17.057 回答