GtkBuilder访问GtkLabel

时间:2015-03-09 18:32:29

标签: c++ gtkmm glade

如何访问标签元素(GtkLabel)以在运行时更改文本?使用此代码,我收到编译错误。

lottozahlen.cpp

Gtk::Window* pWindow = 0;
Gtk::Label* pLabel = 0;

int
main (int argc, char **argv)
{
  Gtk::Main kit (argc, argv);
  Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create_from_file ("ui/main.glade");

  refBuilder->get_widget ("mainWindow", pWindow);
  refBuilder->get_widget ("label_1", pLabel);

  kit.run (*pWindow);

  return (0);
}

编译器错误

/usr/include/gtkmm-3.0/gtkmm/builder.h:628:93: error: incomplete type ‘Gtk::Label’ used in nested name specifier
 widget = dynamic_cast<T_Widget*>(this->get_widget_checked(name, T_Widget::get_base_type()));

2 个答案:

答案 0 :(得分:2)

据推测,您只需要包含gtkmm / label.h标头。包括gtkmm.h应该可以提供你需要的一切。

答案 1 :(得分:0)

规则1。在使用之前永远不要忘记测试指针是否有效

我现在无法测试我的陈述,因为我不使用林间空地,但我记得你需要首先加载一个特定的小部件,将其名称指定为第二个参数,如此:

try // never assume the file exist, it may be removed
{
     Glib::RefPtr<Gtk::Builder> refBuilder =
            Gtk::Builder::create_from_file ("ui/main.glade", "label_1"); // we want label!!
}
catch ( Glib::Error& ex )
{
       std::cout << ex.what() << std::endl;
}

现在加载标签后,我们得到一个指向标签的指针,如下所示:

Gtk::Label* pLabel = 0;
refBuilder->get_widget ("label_1", pLabel); // OK now we have label

if ( pLabel ) // this is the only way to test if pointer is valid
{
      // use pLabel
}
else // label load failed
{
      // handle error
      std::cerr << "label load failed\n" << std::endl;
}

您还必须确保"label_1"*.glade文件中引用的正确名称