事件(函数):
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++;//选择下一张图片
}