Qt学习6-Qt Creator事件(哔站视频学习记录)

一、事件介绍

        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()<<"右键被按下";
    }
}

猜你喜欢

转载自blog.csdn.net/qq_26572229/article/details/129397743