Gtk Spinner没有出现

时间:2010-07-21 15:30:58

标签: gtk gtkmm

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

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

我原本以为旋转器需要知道它出现在哪个对话框上,但是我看不到任何方式将它喂入对象。有谁知道我在哪里可以找到一个有效的例子?我可以在许多地方找到Gtk文档,但这没有多大帮助。

3 个答案:

答案 0 :(得分:2)

你有没有打电话

spinner.show ();

并将其添加到某个窗口?

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

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

偶尔。

答案 1 :(得分: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,并且已经动态翻译了......

答案 2 :(得分:0)

简而言之,如果 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())本身并未进行任何绘制。实际上,它的代码很少。它所做的只是向gtk小部件添加CSS代码:

  • 它将 CSS类旋转器”分配给小部件
  • ,并且只要 widget的布尔值 gtk属性,它就会自动添加和删除 CSS伪类已选中” >“ 活动”更改。

因此,实际外观(图标)和动画是由您当前主题的CSS文件定义的。例如。在Gtk的默认主题的 gtk-contained.css 文件中,您会找到以下内容:

spinner {
  background: none;
  opacity: 0;
  -gtk-icon-source: -gtk-icontheme("process-working-symbolic");
};

这意味着它将在主题的“图标”目录树中自动搜索基本名称为“ 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

替代:

如果您不能或不想安装像 librsvg 这样的具有SVG功能的Gdk pixbuf加载程序,那么您也可以简单地添加具有相同基本名称的图像文件,但是以另一种文件格式(例如“ process-working-symbolic.png ”)添加到主题的图标目录树中。因此,请绘制或下载一些微调图片,然后对其进行缩放,并将其放置几次以达到主题的“ icons”目录中列出的分辨率,例如:

/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()时,微调器图标都会立即出现在屏幕上,但是即使在像样的机器上,微调器通常也要花一秒钟的时间才能开始播放动画。