还有一点时间,再写一篇吧!
最近写了些关于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 )
写完了,这里的字体太有趣了,总自动变色!!!由于表达能力有限,大家将就看吧,希望对大家有帮助!