• 9318阅读
  • 13回复

两个对象使用addWidget添加一个共享对象失败 [复制链接]

上一主题 下一主题
离线libadingzi
 

只看楼主 倒序阅读 楼主  发表于: 2008-10-08
— 本帖被 XChinux 执行加亮操作(2008-10-08) —
我在QMainWindow中定义一个按钮QToolButton和两个QToolBar,这个按钮是给两个QToolBar共用的,
但问题是,第一个QToolBar调用addWidget添加该按钮是成功的,但当第二个QToolBar调用addWidget添加该按钮后,
该按钮却在第一个QToolBar消失掉了,请问有什么方法让两个QToolBar能同时将同一个QToolButton添加到自己
身上:
class SelfMainWindow:public QMainWindow

    Q_OBJECT
public:
    SelfMainWindow();
public:
    QToolButton *btnShared;
    QToolBar *toolBar1;
    QToolBar *toolBar2;
}

SelfMainWindow::SelfMainWindow()
{
    btnShared = new QToolButton();
    toolBar1 = new QToolBar( this );
    toolBar1->addWidget( btnShared);
    toolBar2 = new QToolBar( this );
    toolBar2->addWidget( btnShared);
    addToolBar(toolBar1);
    addToolBar(toolBar2);
}

程序运行后,只有toolBar2上有按钮,toolBar1上没有.
离线chaoscxm
只看该作者 1楼 发表于: 2008-10-08
这个本来就是不可能的呀,一个widget怎么可能有2个parent
帖子签名(将在每个帖子下方显示)
离线water_wf

只看该作者 2楼 发表于: 2008-10-08
楼上的意思儿子可以多个,爹只能一个?:)
离线sbtree
只看该作者 3楼 发表于: 2008-10-08
用QAction实现
windows 7 + VC++2008 + Qt4.5.2
离线libadingzi

只看该作者 4楼 发表于: 2008-10-09
怎么不可能呢? 我认为这是一个对象共用的基本问题,举个例子,C编程中,你创建一个结构体对象,然后你可以通过先malloc一个空间,再用memcpy拷贝这个结构体对象到这个空间中,这样就有两个相同的复本(处于不同的内存空间),在c++中,是可以通过拷贝构造函数来实现,但QT都不提供这样的构造函数
上面两位仁兄,不要将焦点关注在"child",parent上,那只是GUI的一个层次问题,并不是对象实现的本质
.....高手们出来啊?
离线chaoscxm
只看该作者 5楼 发表于: 2008-10-09
如果要复制的话,那就不是对象共用的问题了阿,共用是使用同一个对象,而不是使用副本。
很遗憾的是,QT确实是没有拷贝构造函数的,你可以自己写一个类继承QPushButton,然后实现子类的拷贝构造函数。通常象下面这样
MyPushButton::MyPushButton(const MyPushButton& my)
  : QPushButton(my)
{
    <copy all attributes of my>
}
[ 此贴被chaoscxm在2008-10-09 12:46重新编辑 ]
帖子签名(将在每个帖子下方显示)
离线water_wf

只看该作者 6楼 发表于: 2008-10-09
这就是parent 和child的问题啊,对于GUI控件(注意gui),任何窗口都处于窗口管理器(这个和qt没有关系) 的组织树中(linux下为xwindow),不可能出现一个child的子节点对应两个父节点的
离线sbtree
只看该作者 7楼 发表于: 2008-10-09
这里先澄清一个概念,就是父子关系,qt类的每个实例可以有一个父实例,这与c++中的类的继承关系是不一样的,这完全是两个层次上的概念。qt中的父实例能够管理其子实例,qt这样设计也方便了实现内存管理,例如,一个父实例被删除了,其所有的子实例也被删除。
一个窗体部件的实例不能被嵌入到另外两个其他窗体中应该可以理解,因为这可能涉及到绘图设备,具体要查相关资料。在这个操作中,前一个的父子实例关系会被自动取消,父实例被后来的窗体替代而造成之前的父实例再无法管理这个部件的实例,也就无法重绘界面了。这个问题估计不是qt特有的,楼主不妨可以考察考察其他的界面类库,我没有实际测试,不做断言。qt使用了另一种方式来接决这个问题,就是使用QAction类。这个类直接继承QObject类,不同于继承于QWidget的类,因为QObject类与绘图无关,它的一个实例可以通过QWidget类或其子类的addAction函数被多次使用,而不影响界面。楼主所说的对象共用问题可能在这个问题上跟qt不太相关。
附带说明一点,如果一个类没有定义拷贝函数,c++编译器会给该类自动设置一个=操作,用来一个类的不同实例之间的拷贝,所以即使qt没有拷贝函数,仍然能够实现实例间的相互赋值。
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 8楼 发表于: 2008-10-09
引用第4楼libadingzi于2008-10-09 09:48发表的  :
.....不要将焦点关注在"child",parent上,那只是GUI的一个层次问题,并不是对象实现的本质
.....高手们出来啊?

偶对楼主的这一点理解不敢苟同,我觉得这个父子关系应该是对象在内存中的链表的连接关系
windows 7 + VC++2008 + Qt4.5.2
离线libadingzi

只看该作者 9楼 发表于: 2008-10-10
sbtree兄,你说得不错,QT这样做的确是方便了内存管理。我也想到C++编译器会设置一个"="操作,但是在实例传递中还是实例不了我期望的共享目的。QAction实在是太单纯了,用这个类达不到我的目的,我现在的按钮是自定义的,有图象,有文本,还有箭头
离线libadingzi

只看该作者 10楼 发表于: 2008-10-10
引用第8楼sbtree于2008-10-09 16:18发表的  :
偶对楼主的这一点理解不敢苟同,我觉得这个父子关系应该是对象在内存中的链表的连接关系


我的意思就是说内存节点的层次问题,这是从物理存储观点看的,但从逻辑观点看就是父亲啊,孩子啊什么的形象关系
离线libadingzi

只看该作者 11楼 发表于: 2008-10-10
Quote:

    引用第4楼libadingzi于2008-10-09 09:48发表的  :
    .....不要将焦点关注在"child",parent上,那只是GUI的一个层次问题,并不是对象实现的本质
    .....高手们出来啊?


偶对楼主的这一点理解不敢苟同,我觉得这个父子关系应该是对象在内存中的链表的连接关系----------我的意思正是这样,意思是说要从物理存储的关系去看
离线sbtree
只看该作者 12楼 发表于: 2008-10-10
引用第9楼libadingzi于2008-10-10 14:19发表的  :
sbtree兄,你说得不错,QT这样做的确是方便了内存管理。我也想到C++编译器会设置一个"="操作,但是在实例传递中还是实例不了我期望的共享目的。QAction实在是太单纯了,用这个类达不到我的目的,我现在的按钮是自定义的,有图象,有文本,还有箭头

只能实例化两个按钮了,然后让他们的clicked跟同一个槽连接
windows 7 + VC++2008 + Qt4.5.2
离线water_wf

只看该作者 13楼 发表于: 2008-10-10
一个窗口是不可能显示到两个地方的(当然可以到两个显示器上),xwindows做不到,window也做不到,
快速回复
限100 字节
 
上一个 下一个