• 6341阅读
  • 3回复

各位高手帮忙看下Label写的一个程序 [复制链接]

上一主题 下一主题
离线darkhucx
 

只看楼主 倒序阅读 楼主  发表于: 2006-05-13
#ifndef LAB_H
#define LAB_H

#include <qwidget.h>
#include <qlabel.h>
#include <qevent.h>
#include <qpixmap.h>

class Lab : public QLabel
{
  Q_OBJECT
  public:
  Lab( QLabel *parent=0, const char *name=0 );
  public slots:
    void PressChange(QMouseEvent *);
    void ReleaseChange(QMouseEvent *);
  signals:
  void clicked();
  protected:
  void mousePressEvent(QMouseEvent *);
  void mouseReleaseEvent(QMouseEvent *);
  private:
  QLabel *la;
  bool state;
  QPixmap pix1;
  QPixmap pix2;
};

#endif

#include <qapplication.h>
#include <qlabel.h>
#include <qpixmap.h>
#include <qevent.h>

#include "lab.h"

Lab::Lab(QLabel *parent, const char *name)
  :QLabel(parent, name)
{
   
    QPixmap pix3("STOP_BTN.png");
  la = new QLabel("hello", this);
  //la->setIcon(pix3);
  la->setBackgroundColor(QColor(100,100,100));
  la->setGeometry(0,0,100,100);
  //pix1 = pix3;
  //QPixmap pix4("PLAY_BTN.png");
  //pix2 = pix4;
  //state = false;
}

void Lab::mousePressEvent(QMouseEvent *e)
{  
    PressChange(e);
    emit clicked();
}

void Lab::mouseReleaseEvent(QMouseEvent *e )
{  
    ReleaseChange(e);
    emit clicked();
}

void Lab::PressChange(QMouseEvent *e)
{  
    QPixmap pix1("PLAY_BTN.png");
    QPixmap pix2("STOP_BTN.png");
    switch(e->button())
  {
    case Qt::LeftButton:
        la->setText("OK!!");
        la->setGeometry(0,0,100,100);
        //la->show();
        break;
    case Qt::RightButton:
    case Qt::MidButton:
    case Qt::NoButton:
    case Qt::ShiftButton:
    case Qt::ControlButton:
    case Qt::AltButton:
    case Qt::Keypad:
    case Qt::KeyButtonMask:
    case Qt::MouseButtonMask:
        break;        
    }
   
}

void Lab::ReleaseChange(QMouseEvent *e)
{  
    QPixmap pix1("PLAY_BTN.png");
    QPixmap pix2("STOP_BTN.png");
    switch(e->button())
  {
    case Qt::LeftButton:
        //la->setIcon(pix2);
        la->setText("Hello!");
        la->setGeometry(0,0,100,100);
        //la->show();
        break;
    case Qt::RightButton:
    case Qt::MidButton:
    case Qt::NoButton:
    case Qt::ShiftButton:
    case Qt::ControlButton:
    case Qt::AltButton:
    case Qt::Keypad:
    case Qt::KeyButtonMask:
    case Qt::MouseButtonMask:    
        break;  
    }
   
}

int main( int argc, char **argv )
{
  QApplication a( argc, argv );
  //QPixmap pi("PLAY_BTN.png");
  //QPixmap pi2("STOP_BTN.png");
  Lab aa;
  QObject::connect(&aa, SIGNAL(clicked()), &aa, SLOT(PixChange(QMouseEvent *)));
  QObject::connect(&aa, SIGNAL(clicked()), &aa, SLOT(ReleaseChange(QMouseEvent *)));  
  a.setMainWidget(&aa);
  aa.show();
  return a.exec();
}
[ 此贴被XChinux在2006-05-13 08:46重新编辑 ]
描述:label测试程序
附件: test_3.rar (6 K) 下载次数:16
离线darkhucx

只看该作者 1楼 发表于: 2006-05-13
我想把鼠标的clicked事件映射到Label里而不是在窗体上 有办法吗 各位高手麻烦帮忙看看啊
离线darkhucx

只看该作者 2楼 发表于: 2006-05-13
现在点击窗体外都可以响应鼠标的clicked事件 但是在label里不行
离线tieliu

只看该作者 3楼 发表于: 2006-05-17
1.因为你点击里面的Label时,系统把鼠标消息发送给了里面的QLabel,也就是说
Lab::la->MousePressEvent()将会被调用,而不可能调用Lab::MousePressEvent()。

2.你现在在派生的Lab类里增加了一个QLabel* la成员,这样做没什么意义。
不用再Lab中再嵌套一个QLabel,而是直接用Lab类本身就行了。
3.既然已经在mousePressEvent中调用了PressChange(e),没有必要再
  写QObject::connect( clicked(),.....SLOT(PressChanged(e)这一句。这相当于调用了两次   PressChanged()函数。
  connect( clicked(), ReleaseChanged()) 也有同样的问题!
4.你有一个地方拼写错误:把..connect( clicked(), ...SLOT(PressChanged(.)写成了..connect( clicked(), ...SLOT(PixChanged(.)
快速回复
限100 字节
 
上一个 下一个