qt中的事件

t中的事件一般有鼠标事件(按下  释放) 键盘事件 绘制事件 重绘事件 显示事件 隐藏事件 关闭事件 拖拽事件

1.鼠标事件:一般在绘制图像,鼠标悬浮tips,鼠标按下和释放的不同状态时使用;

 2. 键盘事件:判断用户按下的键盘的哪个键,一般用来控制或捕获用户的输入;

3.绘制事件:在页面刷新(变化时会触发);

4.显示事件和隐藏事件一般在界面切换时使用,自己在不同的界面显示定时器计数时使用过;

5.关闭事件:在程序关闭时需要做的操作可以放到这里面;

6.拖拽事件:在主界面增加文件时使用,避免用户从文件管理器中选择(慢);

下面贴出自己写的Demo:

/***
filename:mainwindow.h
author:zhanglei
date:2020.04.
02
***/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QTextEdit>
#include <QEvent>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void mousePressEvent(QMouseEvent * event)override;//鼠标按下事件
    void mouseMoveEvent(QMouseEvent * event)override;//鼠标移动事件
    void mouseReleaseEvent(QMouseEvent * event)override;//鼠标释放事件
    void keyPressEvent(QKeyEvent *event)override; //键盘按下事件
    void keyReleaseEvent(QKeyEvent *event)override; //键盘松开事件
    void paintEvent(QPaintEvent *e)override;//绘制事件,界面发生改变时会触发该函数
    void resizeEvent(QResizeEvent *event)override;//重绘事件
    bool event(QEvent *e)override;//事件的分发,这个在普通的事件处理之前
    //某些应用场景下,需要拦截某个组件发生的事件,让这个事件不再向其他组件进行传播,这时候可以为这个组件或其父组件安装一个事件过滤器(evenFilter)。
    bool eventFilter ( QObject * watched, QEvent * event )override;
    //显示和隐藏时间,在界面切换的时候有效果,eg:切换页面时的定时器显示
    void showEvent(QShowEvent *event)override;
    void hideEvent(QHideEvent *event)override;
    void closeEvent(QCloseEvent *event)override;
    void dragEnterEvent(QDragEnterEvent *event)override;//拖动进入事件
    void dropEvent(QDropEvent *event)override;//拖动释放事件
private:
    void initUI();

private:
    QWidget *m_pWidget;
    QHBoxLayout *m_phBoxLayout;
    QLabel *m_pLabel;
    QTextEdit *m_pTextEdit;

};

#endif // MAINWINDOW_H
/***
filename:main.cpp
author:zhanglei
date:2020.04.
02
***/

#include "mainwindow.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    w.show();

    return a.exec();
}
/***
filename:mainwindow.cpp
author:zhanglei
date:2020.04.
02
***/

#include "mainwindow.h"
#include <QDebug>
#include <QDesktopWidget>
#include <QApplication>
#include <QFileInfo>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    initUI();
}

MainWindow::~MainWindow()
{

}

void MainWindow::initUI()
{
    m_pWidget = new QWidget;
    m_phBoxLayout = new QHBoxLayout;
    m_pLabel =new QLabel(tr("name:"));
    m_pTextEdit = new QTextEdit;
    m_phBoxLayout->addWidget(m_pLabel);
    m_phBoxLayout->addWidget(m_pTextEdit);
    m_pWidget->setLayout(m_phBoxLayout);
    setCentralWidget(m_pWidget);
    m_pTextEdit->installEventFilter(this);
    /******居中显示******/
    QDesktopWidget* desktop = QApplication::desktop();
    move((desktop->width() - this->width())/2, (desktop->height() - this->height())/2);
    this->setAcceptDrops(true);
    m_pTextEdit->setAcceptDrops(false);
}

void MainWindow::mousePressEvent(QMouseEvent * event)
{
    //获取点击的下标
    qDebug() << event->x() << ":" << event->y();
    if(event->button() == Qt::LeftButton)
    {
       qDebug() << "左键" ;
    }
    else if(event->button() == Qt::RightButton)
    {
       qDebug() << "右键" ;
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug()<<"mouse move Event";
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug()<<"mouse Release Event";
}

void MainWindow::keyPressEvent(QKeyEvent *ev)
{
    if(ev->key() == Qt::Key_Tab)
    {
       qDebug()<<"keyPressEvent"<<ev->text();
       return;
    }

    QWidget::keyPressEvent(ev);
}

void MainWindow::keyReleaseEvent(QKeyEvent *ev)
{
    if(ev->key() == Qt::Key_Tab)
    {
       return;
    }

    QWidget::keyReleaseEvent(ev);
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    qDebug()<<"resizeEvent";
}

void MainWindow::paintEvent(QPaintEvent *e)
{
    // qDebug()<<"paintEvent";
}

bool MainWindow::event(QEvent *e)
{
    if (e->type() == QEvent::KeyPress)
    {
        //将QEvent对象转换为真正的QKeyEvent对象
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
        if (keyEvent->key() == Qt::Key_Tab)
        {
            qDebug() << "You press tab.";
            return true;
        }
    }
    //按照原来的流程来进行事件的分发
    return QMainWindow::event(e);
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == m_pTextEdit)
    {
        if (event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            qDebug() << "you press" << keyEvent->text();
            //事件不再进行传播,拦截
            //Ctrl+Enter换行
            if((keyEvent->modifiers() & Qt::ControlModifier) && (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter))
            {
                QString temp="";
                m_pTextEdit->insertPlainText(temp+='\n');
                return true;
            }
            if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return)
            {
                // 把最后一个回车换行符删掉
                QString strMsg = m_pTextEdit->toPlainText();
                while (strMsg.endsWith("\n")) {
                    strMsg.remove(strMsg.length() - 2, 2);
                }
                qDebug()<<"strMsg"<<strMsg;
                QMessageBox msg;
                msg.setText(strMsg);
                msg.exec();
                  return true;
            }
        }
        else
        {
            return false;//继续传播
        }
    }
    else
    {
        //当不确定是否继续传播时,按照父类的方法来处理
        //即调用父类的evenFilter函数
        return QMainWindow::eventFilter(obj, event);
    }
}

void MainWindow::showEvent(QShowEvent *event)
{
    qDebug()<<"showEvent";
}

void MainWindow::hideEvent(QHideEvent *event)
{
    qDebug()<<"hideEvent";
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    qDebug()<<"closeEvent";
}

void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("text/uri-list"))
    {
      QList<QUrl> urls =  event->mimeData()->urls();

      foreach(QUrl url, urls)
      {
          QFileInfo fi(url.toLocalFile());
          if(fi.isDir())//屏蔽文件夹,不支持拖拽文件夹
          {
              event->ignore();
              return;
          }
      }
      event->acceptProposedAction();
    }
    else
    {
       event->ignore();
    }
}
void MainWindow::dropEvent(QDropEvent *event)
{
    QList<QUrl> urls = event->mimeData()->urls();
    if(urls.isEmpty())
    {
         return;
    }
    foreach(QUrl url, urls)
    {
        qDebug()<<"drag content"<<url.toLocalFile();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值