• 7425阅读
  • 9回复

按钮的触发事件的的应用 [复制链接]

上一主题 下一主题
离线zheng501gf
 

只看楼主 倒序阅读 楼主  发表于: 2008-08-26
— 本帖被 XChinux 执行加亮操作(2008-08-28) —
请大家帮忙!
我想实现一个:当把鼠标放在一个按钮如Qpushbutton的上面时,不需要的点击就能触发的一个显示事件,效果和状态标签一样,不过不显示在状态栏里.显示在指定的位置上.

效果如图1所示
当鼠标放在按钮:用户管理向导:上面时,显示栏里显示相应的内容.

离线rockyluo

只看该作者 1楼 发表于: 2008-08-28
这两天也一直在搞这个问题,不知仁兄是否有啥进展?
QWidget里头有个enterEvent()和leaveEvent()虚函数,文档里头说要在子类中重新实现
我重建了个按钮类,继承QPushButton,写了后编译一直通不过,是参数传递问题
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线zheng501gf

只看该作者 2楼 发表于: 2008-08-28
setMouseTracking(true),再重载mouseMoveEvent(QMouseEvent),判断鼠标的坐标是否在那个按钮的区域
别人建议的不过具体的我还没实现的!

我试着在控件上加个状态栏,然后在Qpushbutton的按钮上添加一个Qction.
离线rockyluo

只看该作者 3楼 发表于: 2008-08-29
别人也是那样建议我的  不过感觉那样不太好
如果那个按钮不要了 且不是鼠标移动到那块区域还是会触发事件?

我用我说的方法已经实现了
重新构建个新类    继承QPushButton      假如为ActivePushButton  在ActivePushButton的类申明里定义上面说的两个虚函数
virtual void enterEvent(QEvent *);
virtual void leaveEvent(QEvent *);
这两个函数是从QWidget里继承来的(在这儿重定义)
再在那两个函数里实现你的功能就行了
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线rockyluo

只看该作者 4楼 发表于: 2008-08-29
顺道问下,你上面那界面都是用Qt4开发的么?
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线zheng501gf

只看该作者 5楼 发表于: 2008-08-29
是的
原来是用delphi做的!
现在把它用QT做,想在LINUX环境下也能运行!
离线rockyluo

只看该作者 6楼 发表于: 2008-08-29
这里似乎不能上传文档,把你邮箱发上来,我传给你参考参考
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线rockyluo

只看该作者 7楼 发表于: 2008-08-29
                                                                      鼠标移动到部件触发事件方法
                                                               Rocky_luo  2008年8月29日于昆山
    鼠标进入/出来某个部件可以由Qwidget中的enterEvent(QEvent *)和leaveEvent(QEvent *)两个虚函数来触发。这样对于某个按钮要实现该功能,可以重新定义个按钮类(class ActivePushButton)来继承QpushButton类,从而在ActivePushButton中重新定义两个虚函数来实现。下图为继承关系:

    QWidget    ::enterEvent(QEvent *)/  leaveEvent(QEvent *)
     ↓                                                               
          QButton                                                         
     ↓                                                               
        QPushButton                                                       
     ↓                                                               
      ActivePushButton                                                   
     ↓                                                               
       →→→  重定义enterEvent(QEvent *)/  leaveEvent(QEvent *)


具体实现:
// *.h文件
// *****************************ActivePushButton class*********************
class ActivePushButton : public QPushButton
{
    Q_OBJECT
public:
    ActivePushButton(const QString &text,QWidget *parent, const char * name=0,int i=0);       
//  i 用来传递一个值,用来标注ActivePushButton所构建的是哪个对象(按钮)
    virtual void enterEvent(QEvent *);     // 重定义
    virtual void leaveEvent(QEvent *);
   
    QGroupBox *pro_box2;
    QWidget *fpb;        // 构建一个窗口指针,来传递 Form1的this
    int select;                // 构建一个int型值,来传递对象的i(标号)
public slots:
    void deleteProduction();        // 用来析构鼠标移动过去触发事件后产生的对象
};
// ********************************  end  ***************************************
析:  用ActivePushButton构建一个新对象b1,如下:
ActivePushButton *b1 = new ActivePushButton(QObject::tr("Config"),this,0,0);
此时,将调用ActivePushButton的构造函数,这时,“this”会传递给“parent”,“0”(标号)会传递给“i”。在构造函数定义中(见.cpp文件),“parent”会将值赋予“fpb”,“i”将值赋予“select”,因此在ActivePushButton类成员中就可以使用Form1的this地址和标号值了。

//  *.cpp文件
// ***********************ActivePushButton class********************
ActivePushButton::ActivePushButton(const QString &text,QWidget *parent,const char * name,int i)
: QPushButton( text,parent, name )
                 // 此处必须指明继承QPushButton ,以完成参数传递
{
    fpb=parent;        //  fpb作为一个“中介”,完成Form1的地址传递到ActivePushButton
    select=i;             //  同上
}

void ActivePushButton::enterEvent(QEvent *e)
{
    // 鼠标进入后,事件触发,以下就是触发后的事件
    printf("enterEvent...");
    pro_box2=new QGroupBox(fpb);     //new一个新对象,放在fpb上,fpb 即为 Form1的地址
    pro_box2->setGeometry(110,100,340,190);
    switch(select)                    //  select 即为 所构建对象的标号
    {
    case 0:
        pro_box2->setTitle(tr("CONFIG"));break;
    case 1:
        pro_box2->setTitle(tr("asljfwe"));break;
    case 2:
        pro_box2->setTitle(tr("NSNKLFNDS<"));break;
    }
    pro_box2->show();        // 切记,不要忘了show()
}

void ActivePushButton::leaveEvent(QEvent *e)
{
    if(pro_box2!=0)                // 鼠标移开时析构掉所构建对象
    {
        delete pro_box2;
        pro_box2=0;
    }
    printf("leaveEvent...");
}

void ActivePushButton::deleteProduction()
{
    if(pro_box2!=0)        // 析构掉所构建对象,与上面不同的是“关键是配合点击事件”
    {
        delete pro_box2;
        pro_box2=0;
    }
    printf("in deleteProduction()...");
}

// ****************************** end ***************************************

析:
ActivePushButton所构建的对象*b1是放在Form1上,因此,在Form1的构造函数定义里会添加信号/槽 连接。如下:
    connect(b1,SIGNAL(pressed()),b1,SLOT(deleteProduction()));
    connect(b1,SIGNAL(released()),this,SLOT(configSlot()));
此处信号没有使用clicked(),主要为了安全起见,确切的说,当clicked()发生时,鼠标的动作是“按下+弹起”,在这个过程中,鼠标还一直置于按钮上,因此,enterEvent事件是先于clicked()前发生,其所构造的对象并未从内存中析构掉。可能造成内存冲突以至于使程序出现段错误。所以,在这里,对于b1按钮,其事件发生顺序为:
a.    enterEvent()——构建pro_box2;
b.    pressed()    ——调用deleteProduction(),析构掉[if pro_box2!=0]所构建对象;
c.    released()  ——调用configSlot(),显示一个界面;
d.    leaveEvent()——析构掉[if pro_box2!=0]所构建对象pro_box2;
// [if pro_box2!=0]表明析构掉前均对对象作判断,存在才析构。析构完了,
// 对其赋值为0,以备下次析构再判断。注意,对一个指针析构后,其值不一定为0。
其实,只要及时、准确的析构掉所构建对象,使用clicked()并非不可,实践证明,将pressed()和released()换为clicked()是可行的。
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线rockyluo

只看该作者 8楼 发表于: 2008-08-29
这是刚整理的资料,你就这样看得咯........
不晓得对你有没有参考价值,反正Qt3能这样实现,你Qt4也绝对能行的
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线zheng501gf

只看该作者 9楼 发表于: 2008-08-29
感激不尽!
肯定有用!

哎,不把这东西做好,老总不给转正!!!没办法呀!!
快速回复
限100 字节
 
上一个 下一个