qt中点击标签响应

还有一点时间,再写一篇吧!

最近写了些关于qt界面,界面这个东西看起来简单,甚至有人会说你做的真难看,但是真写起来,忒麻烦了,那个布局,一层套一层!我都要吐了!当然布局就没什么好写的了,我来说说如何点击标签响应吧!

首先感谢网友,给了我提示,因为qt中的QLabel没有clicked()信号,但可以继承QLabel,自己添加鼠标响应!这样的确可以给一个标签做出响应,但如果是100个标签呢,你怎么知道点击了那个呢???网上收索得知为每个标签添加矩形区域,再根据坐标判断就可以了!但是这样真的太麻烦了!就在我迷糊时,老冯给了我帮助!仿佛让我醍醐灌顶,瞬间通畅!感谢老冯有木有!废话到此结束了,下面开始正题!

首先大家可以先自己看下qt的文档,找下QSignalMapper这个类,先自己理解下,它真的好神奇!他可以将数据传入已有的信号中,这样就可以用一个信号对应多个槽了!

先写下可点击的label类!

.h :

 

 

#include <QtGui>
class ClickedLabel
    :public QLabel      //继承QLabel
{
    Q_OBJECT
public:
    ClickedLabel();
    int MyLabelPressed;
    void mousePressEvent(QMouseEvent *e);//添加鼠标响应事件
    void mouseReleaseEvent(QMouseEvent *e);
signals:
    void clicked();//点击信号
}; 
.cpp :

 

#include "mylabel.h"
ClickedLabel::ClickedLabel()
    :QLabel()
{
    MyLabelPressed = 0;
}
void ClickedLabel::mousePressEvent ( QMouseEvent * e )
{
    MyLabelPressed = 1;
}
void ClickedLabel::mouseReleaseEvent ( QMouseEvent * e )
{
    if ( MyLabelPressed)
    {
        emit clicked();
        MyLabelPressed = 0;
    }
}

 

 
这字体怎么变红了呢!。。。
就这么简单,现在如果有ClickedLabel   new出来的label就能点击了!
下面讲如何传入信号!

 

首先包含头文件#include <QSignalMapper>
然后 QSignalMapper *qsmap=new QSignalMapper(this);
 
字体又变回来了???
在另一个类中假设你用ClickedLabel new 很多label,我起名叫imageLabel[id] !
上个ClickedLabel 类中写到,鼠标一点击就会发出clicked的信号,下面这句话就会执行qt自带的槽函数 map();
 connect(&imageLabel[id],SIGNAL(clicked()),qsmap,SLOT(map()));
 然后你就可以设置一个信号源与传递参数(mapped的参数),就是把不同的标识给不同的label,下面这句!
 qsmap->setMapping(&imageLabel[id],ids[i]);
接着,QSignalMapper这个类会自动发出信号,mapped(),并把你刚才传入的标识放在了信号中,你就可以这句写槽函数接收这个标识,在一个槽函数中
根据不同的标识来做不同的事了 !
connect(qsmap,SIGNAL(mapped(int)),this,SLOT(detailInf(int)));
这里mapped()中可以传递四种类型的参数!分别是:
 
         
void mapped ( int i )
void mapped ( const QString & text )
void mapped ( QWidget * widget )
void mapped ( QObject * object )
     
 写完了,这里的字体太有趣了,总自动变色!!!由于表达能力有限,大家将就看吧,希望对大家有帮助!
 

 

 
 

 

 

你可能感兴趣的:(qt中点击标签响应)