// 处理键盘按键被按下事件
virtual void keyPressEvent(QKeyEvent *event) override;
// 处理键盘按键被释放事件
virtual void keyReleaseEvent(QKeyEvent *event) override;
// 处理鼠标双击事件
virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
// 处理鼠标移动事件
virtual void mouseMoveEvent(QMouseEvent *event) override;
// 处理鼠标按下事件
virtual void mousePressEvent(QMouseEvent *event) override;
// 处理鼠标释放事件
virtual void mouseReleaseEvent(QMouseEvent *event) override;
#pragma once
#include <QWidget>
#include <QKeyEvent>
#include <QMouseEvent>
# define tc(a) QString::fromLocal8Bit(a)
class MyCustomWidget:public QWidget
{
Q_OBJECT
public:
explicit MyCustomWidget(QWidget* parent = nullptr);
protected:
void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override;
void mouseDoubleClickEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
};
#include "MyCustomWidget.h"
#include <QMessageBox>
MyCustomWidget::MyCustomWidget(QWidget *parent) : QWidget(parent) {
setFocusPolicy(Qt::StrongFocus);
}
void MyCustomWidget::keyPressEvent(QKeyEvent * event)
{
if (event->key() == Qt::Key_Enter) {
QMessageBox::information(this, tc("键盘事件"), tc("按下进入"));
}
else {
QWidget::keyPressEvent(event); // 调用基类的事件处理,确保其他键的默认行为
}
}
void MyCustomWidget::keyReleaseEvent(QKeyEvent * event)
{
QMessageBox::information(this, tc("键盘事件"), tc("释放按键"));
}
void MyCustomWidget::mouseDoubleClickEvent(QMouseEvent * event)
{
QMessageBox::information(this, tc("鼠标事件"), tc("双击事件"));
}
void MyCustomWidget::mouseMoveEvent(QMouseEvent * event)
{
QWidget::mouseMoveEvent(event); // 通常不需要中断默认处理
}
void MyCustomWidget::mousePressEvent(QMouseEvent * event)
{
if (event->button() == Qt::LeftButton) {
QMessageBox::information(this, tc("鼠标事件"), tc("鼠标左键按下"));
}
else {
QWidget::mousePressEvent(event);
}
}
void MyCustomWidget::mouseReleaseEvent(QMouseEvent * event)
{
QMessageBox::information(this, tc("鼠标事件"), tc("鼠标释放"));
}
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication1.h"
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include "MyTableModel.hpp"
#include <QSortFilterProxyModel>
#include "MyCustomWidget.h"
class QtWidgetsApplication1 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication1(QWidget *parent = nullptr);
~QtWidgetsApplication1();
MyTableModel myModel;
QSortFilterProxyModel proxyModel;
protected:
bool eventFilter(QObject* watched, QEvent* event) override;
private:
Ui::QtWidgetsApplication1Class ui;
MyCustomWidget *mywidget;
};
#include "QtWidgetsApplication1.h"
#include <QMessageBox>
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//设置源模型
proxyModel.setSourceModel(&myModel);
//为UI设置模型
ui.tableView->setModel(&proxyModel);
//启用排序
ui.tableView->setSortingEnabled(true);
mywidget = new MyCustomWidget(this);
mywidget->installEventFilter(this);
setCentralWidget(mywidget);//设置mymywidget为当前窗口
}
QtWidgetsApplication1::~QtWidgetsApplication1()
{}
bool QtWidgetsApplication1::eventFilter(QObject * watched, QEvent * event)
{
if (watched == mywidget && event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Enter)
{
QMessageBox::information(this, tc("事件过滤器"), tc("enter键被过滤器拦截"));
return true; // 阻止事件进一步传递
}
}
return QMainWindow::eventFilter(watched, event);// 确保其他事件正常传递
}