当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [已解决][求助]libglademm的问题
帖子发表于 : 2008-07-29 13:53 
头像

注册: 2008-06-15 7:47
帖子: 42
地址: 上海
送出感谢: 0 次
接收感谢: 0 次
我在用gtkmm/libglademm编程的时候遇到了一个奇怪问题,可能是libglademm的一个BUG,请大家帮忙看看解决办法。

问题如下:

我要让程序在按下“关于”按钮时显示“关于”对话框。
我先定义
引用:
Gtk::AboutDialog *gp_about_dialog;
,再用Gnome::Glade::Xml的get_widget方法来取得AboutDialog。
引用:
m_refGlade->get_widget("gp_about_dialog", gp_about_dialog);

程序编译没有问题,但是在运行时却出错了。出错信息如下:
代码:
(gpppoe:7858): libglademm-CRITICAL **: widget `gp_about_dialog' not found in glade file `gpppoe.glade'
** (gpppoe:7858): CRITICAL **: Gnome::Glade::Xml::get_widget(): dynamic_cast<> failed.

但是glade文件中明明是有gp_about_dialog的呀,而且在取得其它的窗口时没有问题,只有在取得Gtk::AboutDialog时出错。
是我程序写错了,还是libglademm本身的问题?

我在网上搜索了一下,发现有人也碰到过这个问题。
http://osdir.com/ml/gnome.gnomemm/2005-08/msg00005.html
那人写道:
引用:
After a bit of research and experimentation, it would seem that the
problem lies in the way libglademm handles the <child
internal-child="vbox"> tags, inside widgets derrived from GtkDialog.

我发现Gtk::AboutDialog的确有一个内部的vbox类(如附件中图)。真的是这里出的问题吗?有何解决方法?

附上源代码:
MainWindow.hpp
代码:
#ifndef _MAINWINDOW_HPP_
#define _MAINWINDOW_HPP_

#include <gtkmm.h>
#include <libglademm.h>
//#include <libglademm/xml.h>         //Load widgets from glade file
#include <libglademm/variablesmap.h>   //connect widgets and variables
#include <sigc++/functors/slot.h>         //signal slots

class MainWindow: public Gtk::Window
{
public:
   MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
   virtual ~MainWindow();
   static MainWindow* create();
   
   Gtk::Button *gp_button_connect;

protected:
   Glib::RefPtr<Gnome::Glade::Xml> m_refGlade;
   Gtk::Button *gp_button_about;
   Gtk::Button *gp_button_quit;
   Gtk::AboutDialog *gp_about_dialog;

   //Signal handlers:
   virtual void on_button_quit();
   void on_gp_button_about_clicked();


};

#endif // _MAINWINDOW_HPP_



MainWindow.cpp
代码:
#include <iostream>
#include "MainWindow.hpp"
#include <glibmm.h>
#include <giomm.h>

#define GLADE_FILE "gpppoe.glade"
#define GLADE_NAME "gp_main_window"

MainWindow::MainWindow (BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade)
: Gtk::Window(cobject),
  m_refGlade(refGlade),
  gp_button_about(0),
  gp_about_dialog(0)
{
   //Get the Glade-instantiated Button, and connect a signal handler:
   m_refGlade->get_widget("gp_button_about", gp_button_about);
   gp_button_about->signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_gp_button_about_clicked));
   
   m_refGlade->get_widget("gp_button_quit", gp_button_quit);
   gp_button_quit->signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_button_quit));
   
   m_refGlade->get_widget("gp_button_connect", gp_button_connect);
   //Signal handlers:
   
}

MainWindow::~MainWindow()
{
   
}

MainWindow* MainWindow::create() {
    MainWindow *w = NULL;
    Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME);
    refXml->get_widget_derived(GLADE_NAME, w);
    return w;
}

void MainWindow::on_button_quit () {
   hide();
}

void MainWindow::on_gp_button_about_clicked() {
    gp_about_dialog = 0;
   m_refGlade->get_widget("gp_about_dialog", gp_about_dialog);
    if (gp_about_dialog)
    {
       //std::cout << "gp_about_dialog" << std::endl;      //for test
       gp_about_dialog->show();
    }
}



附件:
文件注释: Gtk::AboutDialog 中的 vbox
Screenshot.png
Screenshot.png [ 5.98 KiB | 被浏览 1041 次 ]


最后由 pro711 编辑于 2008-07-29 16:52,总共编辑了 1 次
页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-07-29 14:51 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
xxxx.glade文件里面看下吧。多半没有那函数。是glade设置属性的时候,控件的那事件那里要写一下函数名的吧。
多看下文件,估计自己就搞定了。


_________________
● 鸣学


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-07-29 16:18 
头像

注册: 2008-06-15 7:47
帖子: 42
地址: 上海
送出感谢: 0 次
接收感谢: 0 次
eexpress 写道:
xxxx.glade文件里面看下吧。多半没有那函数。是glade设置属性的时候,控件的那事件那里要写一下函数名的吧。
多看下文件,估计自己就搞定了。


没有什么函数?
现在似乎和事件处理没有关系,而是根本无法载入那个AboutDialog。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-07-29 16:52 
头像

注册: 2008-06-15 7:47
帖子: 42
地址: 上海
送出感谢: 0 次
接收感谢: 0 次
找到问题了,是我在从文件载入的时候仅仅载入了MainWindow,把AboutDialog给忘了。
唉,太愚蠢了~


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [已解决][求助]libglademm的问题
帖子发表于 : 2008-08-10 19:42 

注册: 2008-06-27 8:09
帖子: 2
送出感谢: 0 次
接收感谢: 0 次
[quote="pro711"]我在用gtkmm/libglademm编程的时候遇到了一个奇怪问题,可能是libglademm的一个BUG,请大家帮忙看看解决办法。


Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE, GLADE_NAME);

这句改成:

Glib::RefPtr<Gnome::Glade::Xml> refXml = Gnome::Glade::Xml::create(GLADE_FILE);

即可,一颗 xml树, 你只砍了一大枝就跑, aboutdialog 在另一树枝上。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译