一、事件介绍
application能够知道哪个窗口在哪个位置,能知道应该由哪个窗口来接收消息,这个窗口会调用自己的消息处理函数。
窗口的event()函数处理所有经过窗口的消息。
消息处理函数是虚函数,使用要进行重载。
常见的QT事件类型:
- 键盘事件:按下和松开
- 鼠标事件:鼠标移动,按下和松开
- 拖放事件:用鼠标进行拖放
- 滚轮事件:鼠标滚轮滚动
- 绘屏事件:重绘屏幕的某些部分
- 定时事件:定时器到时
- 焦点事件:鼠标焦点移动
- 进入和离开事件:鼠标移入widget内和移出
- 移动事件:widget的位置改变
- 大小改变事件:widget的大小改变
- 显示和隐藏事件:widget显示和隐藏
- 窗口事件:窗口是否为当前窗口
QT将系统产生的消息转化为QT事件,QT事件被封装为对象,所有的QT事件均由继承抽象类QEvent,用于描述程序内部或外部发生的动作,任意的QObject对象都具备处理QT事件的能力。
二、事件使用
1、事件
事件是由程序内部或外部产生的事情或某种动作的通称。比如用户按下键盘或鼠标,就会产生一个键盘事件或鼠标事件(这是由程序外部产生的事件);再如,当窗口第一次显示时,会产生一个绘制事件,以通知窗口需要重新绘制其自身,从而使该窗口可见(这是由程序内部产生的事件)。
2、事件和信号
他们两个是不同的概念,不要弄混淆。信号是由对象产生的,而事件则不一定是由对象产生的(比如由鼠标产生的事件),事件通常来自底层的窗口系统,但也可以手动发送自定义的事件,可见信号和事件的来源是不同的。
事件既可以同步使用,也可以异步使用(取决于调用sendEvent()还是postEvents()),而使用信号和槽总是同步的。事件的另一个好处是可以被过滤。
3、QEvent
Qt中使用QEvent及其子类来描述事件,比如QMouseEvent类用于描述与鼠标相关的事件,该类保存了与鼠标相关的大量信息,比如是哪一个键激发了该事件、产生该事件时鼠标的位置等。
三、键盘、鼠标事件例程
1、键盘事件
键盘事件:keyPressEvent()和keyReleaseEvent()
mainwindow.h
#include<QKeyEvent>
//类里面声明keyePressEvent
void keyePressEvent(QMouseEvent *m);
mainwindow.cpp
//事件的完成:重写虚函数,这里重写了keyPressEvent
void MainWindow::keyPressEvent(QKeyEvent *k)
{
if(k->modifiers()==Qt::ControlModifier&&k->key()==Qt::Key_S)//按下“ctrl+S"
{
saveActionSlot();
}
}
按下“ctrl+s”键则保存文件
2、鼠标事件
鼠标事件包括移动、按下、松开、单击、双击等
mainwindow.h
#include<QMouseEvent>
//class里面声明鼠标按下事件
void mousePressEvent(QMouseEvent *m);
mainwindow.cpp
void MainWindow::mousePressEvent(QMouseEvent *m)
{
QPoint pt=m->pos();//获取光标的位置
qDebug() <<pt;
if(m->button() == Qt::LeftButton)
{
qDebug()<<"左键被按下";
}
else if(m->button() == Qt::RightButton)
{
qDebug()<<"右键被按下";
}
}
三、全部代码
继续接着Qt学习5 中的编辑器增加键盘事件、鼠标事件
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QFileDialog>
#include<QMessageBox>
#include<QDebug>
#include<QKeyEvent>
#include<QMouseEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void keyPressEvent(QKeyEvent *k);
void mousePressEvent(QMouseEvent *m);
private slots:
void newActionSlot();
void openActionSlot();
void saveActionSlot();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("编辑器");
this->setWindowIcon(QIcon("D:\\Qt\\Qt-Learn-File\\QtOnline\\MyNoteBook\\icon.png"));
connect(ui->newAction,&QAction::triggered,this,&MainWindow::newActionSlot);
connect(ui->openAction,&QAction::triggered,this,&MainWindow::openActionSlot);
connect(ui->saveAction,&QAction::triggered,this,&MainWindow::saveActionSlot);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::newActionSlot()
{
ui->textEdit->clear();
this->setWindowTitle("新建文本文档.txt");
}
void MainWindow::openActionSlot()
{
QString fileName = QFileDialog::getOpenFileName(this, "选择一个文件",
QCoreApplication::applicationFilePath(),
"*.cpp");//this是打开窗口的对话框的父类对象,第二个参数是打开窗口的title
//第三个是打开窗口的默认路径,这里获取当前路径
//第四个参数,只显示.cpp的文件
if(fileName.isEmpty())
{
QMessageBox::warning(this,"警告"," 请选择一个文件!");
}
else
{
// qDebug()<<fileName;
QFile file(fileName);//创建文件对象
file.open(QIODevice::ReadOnly);
QByteArray ba = file.readAll();
ui->textEdit->setText(QString(ba));
file.close();
}
}
void MainWindow::saveActionSlot()
{
QString fileName=QFileDialog::getSaveFileName(this,"选择一个文件",
QCoreApplication::applicationFilePath()
);//没有第四个参数,会显示所有文件
if(fileName.isEmpty())
{
QMessageBox::warning(this,"警告","请选择一个文件");
}
else
{
QFile file(fileName);
file.open(QIODevice::WriteOnly);
QByteArray ba;
ba.append( ui->textEdit->toPlainText());//QString转QByteArray
file.write(ba);
file.close();
}
}
//事件的完成:重写虚函数,这里重写了keyPressEvent
void MainWindow::keyPressEvent(QKeyEvent *k)
{
if(k->modifiers()==Qt::ControlModifier&&k->key()==Qt::Key_S)//按下“ctrl+S"
{
saveActionSlot();
}
}
void MainWindow::mousePressEvent(QMouseEvent *m)
{
QPoint pt=m->pos();//获取光标的位置
qDebug() <<pt;
if(m->button() == Qt::LeftButton)
{
qDebug()<<"左键被按下";
}
else if(m->button() == Qt::RightButton)
{
qDebug()<<"右键被按下";
}
}