Qt-------->第四天,事件

事件(函数):

QT已经预先定义好的某些信号对应的处理动作函数。
若QT工程中要使用这些事件函数,需要重写事件函数
事件函数无需用户主动调用,也无需用户将其和某个信号关联,这些事件函数就是对应信号的槽函数,当信号发出,事件函数会被系统自动调用。   
1 键盘事件
  键盘按压事件: keyPressEvent(QKeyEvent &)
  键盘释放事件:keyReleaseEvent(QKeyEvent &)
2 鼠标事件
   鼠标按压事件:mousePressEvent(QMouseEvent &)
   鼠标释放事件:  mouseReleseEvent(QMouseEvent &)
   鼠标移动事件: mouseMoveEvent(QMouseEvent &)
   鼠标双击事件: mouseDoubleClickedEvent(QMouseEvent &)

​
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//重写事件函数
void Widget::keyPressEvent(QKeyEvent *event)
{
    //event->text()获取键盘事件对象中的文本值
    ui->label->setText("键盘按压:"+event->text());
}

void Widget::keyReleaseEvent(QKeyEvent *event)
{
    ui->label->setText("键盘释放:"+event->text());
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    QString str="鼠标按压:";
    if(Qt::LeftButton==event->button())
    {
        str+="鼠标左键";
    }
    else if(Qt::RightButton==event->button())
    {
        str+="鼠标右键";
    }
    else
    {
        str+="中间键";
    }
    ui->label->setText(str);
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    QString str="鼠标释放:";
    if(Qt::LeftButton==event->button())
    {
        str+="鼠标左键";
    }
    else if(Qt::RightButton==event->button())
    {
        str+="鼠标右键";
    }
    else
    {
        str+="中间键";
    }
    ui->label->setText(str);
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
   QString str;
   str.sprintf("gx=%d,gy=%d,x=%d,y=%d\n",
       event->globalX(),event->globalY(),event->x(),event->y());
    ui->label->setText(str);
}

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    QString str="鼠标双击:";
    if(Qt::LeftButton==event->button())
    {
        str+="鼠标左键";
    }
    else if(Qt::RightButton==event->button())
    {
        str+="鼠标右键";
    }
    else
    {
        str+="中间键";
    }
    ui->label->setText(str);
}

​


3 事件过滤函数
   bool  eventFilter(QObject *watched, QEvent *event)
   既可以过滤鼠标事件有可以过滤键盘事件
   QEvent:通用事件类,派生出了 QKeyEvent和QMouseEvent

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QKeyEvent>//键盘事件类
#include <QEvent>//通用事件类

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->installEventFilter(this);//安装事件过滤器
    ui->lineEdit_2->installEventFilter(this);//安装事件过滤器
}

Widget::~Widget()
{
    delete ui;
}

//重写事件过滤函数
//watched----->观察器,event------>过滤器,QEvent--->通用事件类
bool Widget::eventFilter(QObject *watched,QEvent *event)
{
    switch(event->type())//获取事件类型
    {
        //按键按压事件
        case QEvent::KeyPress:
             {
                if(watched==ui->lineEdit)//如果按压事件落在ui->lineEdit,就过滤
                {
                    //将事件中的按键值取出,然后判断是否是0-9
                    QKeyEvent *temp=static_cast<QKeyEvent *>(event);//static_cast<>()-->转化函数
                    int ret=temp->key();//key()---->获取当前对象(按压)的按键值
                    //保留0-9,其他按键过滤
                    if(Qt::Key_0<=ret && ret<=Qt::Key_9)
                    {
                       return false;//返回false,就是不过滤
                    }
                    else
                    {
                        qDebug()<<"其他按键~"<<endl;
                        return true;//过滤其他按键值
                    }
                }
                else
                {
                    qDebug()<<"其他控件~"<<endl;
                    return false;//其他控件不过滤
                }
                break;
              }
        default:
            break;
    }
    return false;//其他事件不过滤
}


4 定时器事件
   timerEvent(QTimerEvent *event)
   startTimer(1000);

#include "widget.h"
#include "ui_widget.h"
#include <QDateTime>//时间日期类

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->startTimer(1000);//启动当前窗体默认的定时器,定时时间1000ms
}

Widget::~Widget()
{
    delete ui;
}

void Widget::timerEvent(QTimerEvent *event)
{
    QDateTime dt=QDateTime::currentDateTime();
    QString str=dt.toString("yyyy-MM-dd hh:mm:ss");
    ui->label->setText(str);
}


5 显示照片
   QPixmap QImage

#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>//图片类

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
#if 0
    QPixmap map(":/3.jpg");
    ui->label->setPixmap(map);
    ui->label->setScaledContents(true);
#endif
   // QImage img(":/3.jpg");
    QImage img;
    img.load(":/3.jpg");//将图片3.jpg加载到img
    QPixmap map=QPixmap::fromImage(img);//QImage类型转换QPixmap

    ui->label->setPixmap(map);//将图片放到label控件中
    ui->label->setScaledContents(true);//图片自适应label大小
}

Widget::~Widget()
{
    delete ui;
}

6 网络信息获取(相应的Qt工程文件得加network模块)
   QNetworkRequest--->用于表示网络请求
   QNetworkAccessManger-->用于协调网络操作  get
   QNetworkReply-->用于网络请求的响应 

#include "widget.h"
#include "ui_widget.h"
#include <QUrl>//网址类
#include <QDebug>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkAddressEntry>
#include <QtNetwork/QNetworkReply>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);
    connect(manager,SIGNAL(finished(QNetworkReply*)),
            this,SLOT(slotNetWorkReply(QNetworkReply*)));
     //manager->get(QNetworkRequest(QUrl("http://hq.sinajs.cn/list=sh600031")));
    //manager->get(QNetworkRequest(QUrl("http://hq.sinajs.cn/list=sh600519")));
    manager->get(QNetworkRequest(QUrl("http://hq.sinajs.cn/list=sh600035")));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::slotNetWorkReply(QNetworkReply *reply)
{
    qDebug() << "get MSG";
    QStringList list;//QStringList---->链表类
    QByteArray arr;//QByteArray-------->字节数组类
    QString str;
    arr = reply->readAll();
    str = QString::fromLocal8Bit(arr);//转码
    list = str.split("=");//split()分离函数----->将"="两边的数据分别存放在list.at(0),list.at(1)这两个结点
    qDebug() <<"测试--------"<<str<<endl;
    QString code_Orig = list.at(0);
    QString strName_Orig;
    strName_Orig = list.at(1);

    list = strName_Orig.split(",");
    qDebug() << list.at(0);
    QString RealName = list.at(0);
    //RealName = RealName.split("\"").at(1);
    this->setWindowTitle(RealName);
    for(int i=0;i<list.size();i++)
    {
        qDebug()<< list.at(i);
    }
    ui->label_open->setText(list.at(1));
    ui->label_close->setText(list.at(2));
    ui->label_current->setText(list.at(3));
    ui->label_top->setText(list.at(4));
    ui->label_bottom->setText(list.at(5));
    ui->label_name->setText(RealName);
    QString time = list.at(30) +"  " +list.at(31);

    ui->label_time->setText(time);
    ui->label_code->setText(code_Orig);
    reply->deleteLater();//删除网络响应缓冲区的数据
}

电子相册:

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>//定时器类
#include <QPixmap>//图片类
#include <QString>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setScaledContents(true);//图片自适应label控件大小

    //将图片地址存放到str数组中
    str[0]=":images/1.jpg";
    str[1]=":images/2.jpeg";
    str[2]=":images/3.jpg";
    str[3]=":images/4.jpeg";
    str[4]=":images/5.jpg";
    str[5]=":images/6.jpeg";
    str[6]=":images/7.jpg";
    str[7]=":images/8.jpg";
    str[8]=":images/9.jpg";
    str[9]=":images/10.jpeg";
    i = 0;

    //信号和槽的关联
    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(timerfunc()));//播放图片,且启动定时器
    connect(&timer,SIGNAL(timeout()),this,SLOT(showproject()));//定时时间到,播放下一张图片

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    if(10==i)
    {
        i=0;
    }
    QImage image;
    image.load(str[i]);
    QPixmap map = QPixmap::fromImage(image);
    ui->label->setPixmap(map);

}

void Widget::on_pushButton_2_clicked()
{
    timer.stop();//暂停播放图片
}

void Widget::on_pushButton_3_clicked()
{
    i++;//选择下一张图片
    if(10==i)
    {
        i=0;
    }
    QImage image;
    image.load(str[i]);
    QPixmap map = QPixmap::fromImage(image);
    ui->label->setPixmap(map);
}

void Widget::on_pushButton_4_clicked()
{
    i--;//选择上一张图片
    if(10==i)
    {
        i=0;
    }
    QImage image;
    image.load(str[i]);//将str数组中的图片加载到image
    QPixmap map = QPixmap::fromImage(image);//QImage类转换成QPixmap类
    ui->label->setPixmap(map);//将图片放到label中
}

void Widget::on_pushButton_5_clicked()
{
    this->close();//关闭窗口
}

void Widget::timerfunc()
{
    if("播放"==ui->pushButton->text())
    {
        timer.start(1000);
        ui->pushButton->setText("正在播放");
    }
    else
    {
        timer.stop();//暂停播放图片
        ui->pushButton->setText("播放");
    }
}

void Widget::showproject()
{
    if(10==i)
    {
       i=0;
    }
    QImage image;
    image.load(str[i]);
    QPixmap map = QPixmap::fromImage(image);
    ui->label->setPixmap(map);
    i++;//选择下一张图片
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值