• 7205阅读
  • 9回复

鼠标移动到按钮上面时如何获得按钮的ID,或对象名 [复制链接]

上一主题 下一主题
离线duduqq
 

只看楼主 倒序阅读 楼主  发表于: 2008-07-28
— 本帖被 XChinux 执行加亮操作(2008-07-29) —
我在QDialog里面加了三个QWidget,然后在每个QWidget里面加上一些按钮,我现在想在鼠标移动时获得按钮的信息,要如何获得。我用childeAt只能得到三个QWidget的ID和对象名,但得不到按钮的信息。

PS:其实用childAt(event->pos())就可以解决的了,只不过我开始没有把每个QPushButton设置setMouseTracking(true) ;
[ 此贴被duduqq在2008-07-29 21:26重新编辑 ]
离线xjcook

只看该作者 1楼 发表于: 2008-07-28
按钮的parent是widget,你使用child得不到是正常的。
要实现你要的目的可以有几个办法
一个不好的办法是在你的qdialog中不停的得到鼠标位置,然后在一个递归函数中使用childeAt来得到是不是在某个qwidget上。
一个好办法是处理按钮的QMouseMoveEvent,但是需要重写按钮。
还有一个办法是使用事件过滤,在事件过滤里面取得QMouseMoveEvent。
离线duduqq

只看该作者 2楼 发表于: 2008-07-28
引用第1楼xjcook于2008-07-28 15:43发表的  :
按钮的parent是widget,你使用child得不到是正常的。
要实现你要的目的可以有几个办法
一个不好的办法是在你的qdialog中不停的得到鼠标位置,然后在一个递归函数中使用childeAt来得到是不是在某个qwidget上。
一个好办法是处理按钮的QMouseMoveEvent,但是需要重写按钮。
还有一个办法是使用事件过滤,在事件过滤里面取得QMouseMoveEvent。


多谢你能回答我的问题!!!
你说的重写按钮是什么意思,如何重写。
我现在是在mouseMoveEvent()里面用childeAt,我想是在鼠标移动时就能得到当前鼠标下面的按钮是哪个按钮,我想不用按下鼠标左键就能得到这个按钮,要如何做。
离线water_wf

只看该作者 3楼 发表于: 2008-07-29
用qFindChild应该可以找到的
离线water_wf

只看该作者 4楼 发表于: 2008-07-29
qFindChild(parent,"对象名")
离线duduqq

只看该作者 5楼 发表于: 2008-07-29
引用第4楼water_wf于2008-07-29 00:33发表的  :
qFindChild(parent,"对象名")

但我现在不知道对象名,而只想在鼠标在那个按钮上面时能返回这个按钮的对象名给我。
离线xjcook

只看该作者 6楼 发表于: 2008-07-29
引用第2楼duduqq于2008-07-28 19:42发表的  :
多谢你能回答我的问题!!!
你说的重写按钮是什么意思,如何重写。
我现在是在mouseMoveEvent()里面用childeAt,我想是在鼠标移动时就能得到当前鼠标下面的按钮是哪个按钮,我想不用按下鼠标左键就能得到这个按钮,要如何做。



重写就是继承于原来的按钮,自己重新实现一个按钮类,你可以在这个按钮的mouseMoveEvent中发射一个信号,连倒需要知道的那个东西的某个槽上,最好加点处理使其只有第一次鼠标移动到上面才发,以后就不发了。
离线duduqq

只看该作者 7楼 发表于: 2008-07-29
引用第6楼xjcook于2008-07-29 08:59发表的  :
重写就是继承于原来的按钮,自己重新实现一个按钮类,你可以在这个按钮的mouseMoveEvent中发射一个信号,连倒需要知道的那个东西的某个槽上,最好加点处理使其只有第一次鼠标移动到上面才发,以后就不发了。

这个方法可能行得通,但就是要改的地方太多了,我现在工程比较大,改了可能比较麻烦,你说的那个不好的方法我觉得现在对我来说是一种 比较好的方法,但我不知如何在一个递归函数中使用childeAt
能写几行代码指导一下吗
离线xjcook

只看该作者 8楼 发表于: 2008-07-29
大概是这个样子,没有测试过
QObject × getObj(QObject* iobj)
{
    if( !iobj)
        return NULL;
    QObjectList * list = iobj->children();
    QObject *op;
    for ( op= list.first();op;op = list.next() )
    {
        if( op->children()->count()>0)
        {
            QObject * ret = getObj(op);//如果还有child,递归调用此函数
            if( ret )
                return ret;
        }
        QPushButton *bt = dynamic_cast<QPushButton*>(op)//把这个object转为按钮
        if( bt)
          {
                  //添加你判断位置的代码,如果在区域内,返回op
          }
      }
    return NULL;
}

还是推荐使用事件过滤,eventFilter,QT带有例子。
离线duduqq

只看该作者 9楼 发表于: 2008-07-29
其实用childAt(event->pos())就可以解决的了,只不过我开始没有把每个QPushButton设置setMouseTracking(true) ;
快速回复
限100 字节
 
上一个 下一个