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();
}
}