accept()
函数与ignore
()函数
#include
#include
#include
#include
#include
class Button :public QPushButton
{
public:
Button(const QString& text, QWidget* parent = nullptr) :QPushButton(text, parent)
{
}
protected:
bool event(QEvent* ev) override
{
if (ev->type() == QEvent::Type::KeyPress)
{
//获取当前按下的按键
QKeyEvent* kev = dynamic_cast<QKeyEvent*>(ev);
qDebug() << Qt::Key(kev->key());
//当回车键按下,我们忽略事件。原理是,我们直接在这返回,不会传递到父组件去进行处理,下面的信号的按钮按下就不会触发了
//忽略事件
return true;
}
return QPushButton::event(ev);//返回true表示事件已经处理完成,否则表示忽略
}
void mousePressEvent(QMouseEvent* ev) override
{
qDebug() << __FUNCSIG__;
//ev->accept();//默认调用的
ev->ignore();//忽略事件处理,事件将传播到父组件
}
};
class Widget :public QWidget
{
Q_OBJECT
public:
Widget(QWidget* parent = nullptr) :QWidget(parent)
{
Button* btn = new Button("小瓜",this);
//设置按钮为默认按钮
btn->setDefault(true);
connect(btn, &Button::clicked, this, []()
{
qDebug() << "按钮按下";
}
);
}
protected:
void mousePressEvent(QMouseEvent* ev) override
{
qDebug() << __FUNCSIG__;
}
};
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
Widget w;
w.setWindowIcon(QIcon(":/Resource/tubiao.ico"));
w.show();
return a.exec();
}
#include "main.moc"
#include
#include
#include
#include
#include
//作为单独的一个实例
#define myApp static_cast<MyApp*>(qApp)
//应用程序类
class MyApp :public QApplication
{
public:
//将其构造函数继承过来
using QApplication::QApplication;
//一般不会用这个函数,因为无论是那个窗口那个对象的事件都会通过这个函数来发
//除非你真的需要无论在那个窗口或者那个键需要干什么事情,在来这个上面写
//重写notify
/*bool notify(QObject* receiver, QEvent* ev) override
{
if (ev->type() == QEvent::Close)
{
qDebug() << "退出";
}
return true;
}*/
//放一些所有程序或者是窗口可能会访问的数据,就可以不用全局变量了
void addValue(const QString& key, const QVariant& v)
{
m_config.insert(key, v);
}
QVariant value(const QString& key)
{
return m_config.value(key);
}
protected:
QMap<QString, QVariant> m_config;
};
class Widget :public QWidget
{
Q_OBJECT
public:
Widget(QWidget* parent = nullptr) :QWidget(parent)
,btn(new QPushButton("获取信息", this))
{
connect(btn, &QPushButton::clicked, this, []()
{
qDebug() << myApp->value("appName") << myApp->value("version");
}
);
}
protected:
QPushButton* btn{};
};
int main(int argc, char* argv[])
{
MyApp a(argc, argv);
a.addValue("appName", "小瓜");
a.addValue("version", "1.0");
Widget w;
w.setWindowIcon(QIcon(":/Resource/tubiao.ico"));
w.show();
return a.exec();
}
#include "main.moc"
#include
#include
#include
#include
#include
//单独写一个类来过滤
class SEventFilterObject :public QObject
{
public:
//这样才没有内存泄漏
SEventFilterObject(QObject* parent = nullptr) :QObject(parent)
{
}
~SEventFilterObject()
{
qDebug() << __FUNCTION__;
}
bool eventFilter(QObject* watched, QEvent* event)
{
if (event->type() == QEvent::MouseButtonPress)
{
return true;//返回true表示被处理了,不会发到event了
}
else if (event->type() == QEvent::MouseButtonDblClick)
{
return true;
}
return false;
}
};
class Widget :public QWidget
{
Q_OBJECT
public:
Widget(QWidget* parent = nullptr) :QWidget(parent)
{
//安装事件过滤器
//installEventFilter(this);
installEventFilter(new SEventFilterObject);
//取消安装事件过滤器
//installEventFilter(nullptr);
}
protected:
//事件过略器
//bool eventFilter(QObject* watched, QEvent* event)
//{
// if (event->type() == QEvent::MouseButtonPress)
// {
// return true;//返回true表示被处理了,不会发到event了
// }
// else if (event->type() == QEvent::MouseButtonDblClick)
// {
// return true;
// }
// return false;
//}
void mousePressEvent(QMouseEvent* ev) override
{
qDebug() << __FUNCSIG__;
}
};
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
Widget w;
w.setWindowIcon(QIcon(":/Resource/tubiao.ico"));
w.show();
return a.exec();
}
#include "main.moc"
#include "SEventFilterObject.h"
SEventFilterObject::SEventFilterObject(QObject* parent):QObject(parent)
{
}
SEventFilterObject::~SEventFilterObject()
{
std::cout<< __FUNCTION__;
}
bool SEventFilterObject::eventFilter(QObject* watched, QEvent* event)
{
QWidget* w = dynamic_cast<QWidget*>(watched);
//如果窗口没有边框,才对点击窗口客户区移动窗口
if (w->windowFlags() & Qt::FramelessWindowHint)
{
//获取鼠标点击事件
QMouseEvent* ev = dynamic_cast<QMouseEvent*>(event);
if (event->type() == QEvent::MouseButtonPress && ev->button() == Qt::MouseButton::LeftButton)
{
m_pos = ev->pos();
}
else if (event->type() == QEvent::MouseButtonRelease && ev->button() == Qt::MouseButton::LeftButton)
{
m_pos = { 0,0 };
}
else if (event->type() == QEvent::MouseMove && ev->buttons() & Qt::LeftButton)
{
w->move(ev->globalPos() - m_pos);
}
}
return false;
}
#ifndef SEVENTFILTEROBJECT_H_
#define SEVENTFILTEROBJECT_H_
#include
#include
#include
#include
#include
#include
class SEventFilterObject : public QObject
{
public:
//构造函数
SEventFilterObject(QObject* parent = nullptr);
~SEventFilterObject();
bool eventFilter(QObject* watched, QEvent* event)override;
protected:
QPoint m_pos;
};
#endif // !SEVENTFILTEROBJECT_H_
#include
#include
#include
#include
#include
#include "SEventFilterObject.h"
class Widget :public QWidget
{
public:
Widget(QWidget* parent = nullptr) :QWidget(parent)
,m_close(new QPushButton("X",this))
{
resize(400, 400);
m_close->setFixedSize(50, 50);
m_close->move(width() - m_close->width(), 0);
//设置鼠标追踪
setMouseTracking(true);
//去掉窗口边框
setWindowFlag(Qt::FramelessWindowHint, true);
//安装过滤器
installEventFilter(new SEventFilterObject(this));
connect(m_close, &QPushButton::clicked, this, [=]()
{
close();
}
);
}
~Widget()
{
qDebug() << __FUNCTION__;
}
protected:
private:
QPushButton* m_close{};
};
int main(int argc,char* argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
这个枚举类型定义了Qt中有效的事件类型。事件类型和每个类型的专门类如下:
常量 | 值 | 描述 |
---|---|---|
QEvent::None | 0 | 不是一个事件 |
QEvent::ActionAdded | 114 | 一个新 action 被添加(QActionEvent) |
QEvent::ActionChanged | 113 | 一个 action 被改变(QActionEvent) |
QEvent::ActionRemoved | 115 | 一个 action 被移除(QActionEvent) |
QEvent::ActivationChange | 99 | Widget 的顶层窗口激活状态发生了变化 |
QEvent::ApplicationActivate | 121 | 这个枚举已被弃用,使用 ApplicationStateChange 代替 |
QEvent::ApplicationActivated | ApplicationActivate | 这个枚举已被弃用,使用 ApplicationStateChange 代替 |
QEvent::ApplicationDeactivate | 122 | 这个枚举已被弃用,使用 ApplicationStateChange 代替 |
QEvent::ApplicationFontChange | 36 | 应用程序的默认字体发生了变化 |
QEvent::ApplicationLayoutDirectionChange | 37 | 应用程序的默认布局方向发生了变化 |
QEvent::ApplicationPaletteChange | 38 | 应用程序的默认调色板发生了变化 |
QEvent::ApplicationStateChange | 214 | 应用程序的状态发生了变化 |
QEvent::ApplicationWindowIconChange | 35 | 应用程序的图标发生了变化 |
QEvent::ChildAdded | 68 | 一个对象获得孩子(QChildEvent) |
QEvent::ChildPolished | 69 | 一个部件的孩子被爆光(QChildEvent) |
QEvent::ChildRemoved | 71 | 一个对象时区孩子(QChildEvent) |
QEvent::Clipboard | 40 | 剪贴板的内容发生改变 |
QEvent::Close | 19 | Widget 被关闭(QCloseEvent) |
QEvent::CloseSoftwareInputPanel | 200 | 一个部件要关闭软件输入面板(SIP) |
QEvent::ContentsRectChange | 178 | 部件内容区域的外边距发生改变 |
QEvent::ContextMenu | 82 | 上下文弹出菜单(QContextMenuEvent) |
QEvent::CursorChange | 183 | 部件的鼠标发生改变 |
QEvent::DeferredDelete | 52 | 对象被清除后将被删除(QDeferredDeleteEvent) |
QEvent::DragEnter | 60 | 在拖放操作期间鼠标进入窗口部件(QDragEnterEvent) |
QEvent::DragLeave | 62 | 在拖放操作期间鼠标离开窗口部件(QDragLeaveEvent) |
QEvent::DragMove | 61 | 拖放操作正在进行(QDragMoveEvent) |
QEvent::Drop | 63 | 拖放操作完成(QDropEvent) |
QEvent::DynamicPropertyChange | 170 | 动态属性已添加、更改或从对象中删除 |
QEvent::EnabledChange | 98 | 部件的 enabled 状态已更改 |
QEvent::Enter | 10 | 鼠标进入部件的边界(QEnterEvent) |
QEvent::EnterEditFocus | 150 | 编辑部件获得焦点进行编辑,必须定义 QT_KEYPAD_NAVIGATION |
QEvent::EnterWhatsThisMode | 124 | 当应用程序进入“What’s This?”模式,发送到 toplevel 顶层部件 |
QEvent::Expose | 206 | 当其屏幕上的内容无效,发送到窗口,并需要从后台存储刷新 |
QEvent::FileOpen | 116 | 文件打开请求(QFileOpenEvent) |
QEvent::FocusIn | 8 | 部件或窗口获得键盘焦点(QFocusEvent) |
QEvent::FocusOut | 9 | 部件或窗口失去键盘焦点(QFocusEvent) |
QEvent::FocusAboutToChange | 23 | 部件或窗口焦点即将改变(QFocusEvent) |
QEvent::FontChange | 97 | 部件的字体发生改变 |
QEvent::Gesture | 198 | 触发了一个手势(QGestureEvent) |
QEvent::GestureOverride | 202 | 触发了手势覆盖(QGestureEvent) |
QEvent::GrabKeyboard | 188 | Item 获得键盘抓取(仅限 QGraphicsItem) |
QEvent::GrabMouse | 186 | 项目获得鼠标抓取(仅限 QGraphicsItem) |
QEvent::GraphicsSceneContextMenu | 159 | 在图形场景上的上下文弹出菜单(QGraphicsScene ContextMenuEvent) |
QEvent::GraphicsSceneDragEnter | 164 | 在拖放操作期间,鼠标进入图形场景(QGraphicsSceneDragDropEvent) |
QEvent::GraphicsSceneDragLeave | 166 | 在拖放操作期间鼠标离开图形场景(QGraphicsSceneDragDropEvent) |
QEvent::GraphicsSceneDragMove | 165 | 在场景上正在进行拖放操作(QGraphicsSceneDragDropEvent) |
QEvent::GraphicsSceneDrop | 167 | 在场景上完成拖放操作(QGraphicsSceneDragDropEvent) |
QEvent::GraphicsSceneHelp | 163 | 用户请求图形场景的帮助(QHelpEvent) |
QEvent::GraphicsSceneHoverEnter | 160 | 鼠标进入图形场景中的悬停项(QGraphicsSceneHoverEvent) |
QEvent::GraphicsSceneHoverLeave | 162 | 鼠标离开图形场景中一个悬停项(QGraphicsSceneHoverEvent) |
QEvent::GraphicsSceneHoverMove | 161 | 鼠标在图形场景中的悬停项内移动(QGraphicsSceneHoverEvent) |
QEvent::GraphicsSceneMouseDoubleClick | 158 | 鼠标在图形场景中再次按下(双击)(QGraphicsSceneMouseEvent) |
QEvent::GraphicsSceneMouseMove | 155 | 鼠标在图形场景中移动(QGraphicsSceneMouseEvent) |
QEvent::GraphicsSceneMousePress | 156 | 鼠标在图形场景中按下(QGraphicsSceneMouseEvent) |
QEvent::GraphicsSceneMouseRelease | 157 | 鼠标在图形场景中释放(QGraphicsSceneMouseEvent) |
QEvent::GraphicsSceneMove | 182 | 部件被移动(QGraphicsSceneMoveEvent) |
QEvent::GraphicsSceneResize | 181 | 部件已调整大小(QGraphicsSceneResizeEvent) |
QEvent::GraphicsSceneWheel | 168 | 鼠标滚轮在图形场景中滚动(QGraphicsSceneWheelEvent) |
QEvent::Hide | 18 | 部件被隐藏(QHideEvent) |
QEvent::HideToParent | 27 | 子部件被隐藏(QHideEvent) |
QEvent::HoverEnter | 127 | 鼠标进入悬停部件(QHoverEvent) |
QEvent::HoverLeave | 128 | 鼠标留离开悬停部件(QHoverEvent) |
QEvent::HoverMove | 129 | 鼠标在悬停部件内移动(QHoverEvent) |
QEvent::IconDrag | 96 | 窗口的主图标被拖走(QIconDragEvent) |
QEvent::IconTextChange | 101 | 部件的图标文本发生改变(已弃用) |
QEvent::InputMethod | 83 | 正在使用输入法(QInputMethodEvent) |
QEvent::InputMethodQuery | 207 | 输入法查询事件(QInputMethodQueryEvent) |
QEvent::KeyboardLayoutChange | 169 | 键盘布局已更改 |
QEvent::KeyPress | 6 | 键盘按下(QKeyEvent) |
QEvent::KeyRelease | 7 | 键盘释放(QKeyEvent) |
QEvent::LanguageChange | 89 | 应用程序翻译发生改变 |
QEvent::LayoutDirectionChange | 90 | 布局的方向发生改变 |
QEvent::LayoutRequest | 76 | 部件的布局需要重做 |
QEvent::Leave | 11 | 鼠标离开部件的边界 |
QEvent::LeaveEditFocus | 151 | 编辑部件失去编辑的焦点,必须定义 QT_KEYPAD_NAVIGATION |
QEvent::LeaveWhatsThisMode | 125 | 当应用程序离开“What’s This?”模式,发送到顶层部件 |
QEvent::LocaleChange | 88 | 系统区域设置发生改变 |
QEvent::NonClientAreaMouseButtonDblClick | 176 | 鼠标双击发生在客户端区域外 |
QEvent::NonClientAreaMouseButtonPress | 174 | 鼠标按钮按下发生在客户端区域外 |
QEvent::NonClientAreaMouseButtonRelease | 175 | 鼠标按钮释放发生在客户端区域外 |
QEvent::NonClientAreaMouseMove | 173 | 鼠标移动发生在客户区域外 |
QEvent::MacSizeChange | 177 | 用户更改了部件的大小(仅限 OS X) |
QEvent::MetaCall | 43 | 通过 QMetaObject::invokeMethod() 调用异步方法 |
QEvent::ModifiedChange | 102 | 部件修改状态发生改变 |
QEvent::MouseButtonDblClick | 4 | 鼠标再次按下(QMouseEvent) |
QEvent::MouseButtonPress | 2 | 鼠标按下(QMouseEvent) |
QEvent::MouseButtonRelease | 3 | 鼠标释放(QMouseEvent) |
QEvent::MouseMove | 5 | 鼠标移动(QMouseEvent) |
QEvent::MouseTrackingChange | 109 | 鼠标跟踪状态发生改变 |
QEvent::Move | 13 | 部件的位置发生改变(QMoveEvent) |
QEvent::NativeGesture | 197 | 系统检测到手势(QNativeGestureEvent) |
QEvent::OrientationChange | 208 | 屏幕方向发生改变(QScreenOrientationChangeEvent) |
QEvent::Paint | 12 | 需要屏幕更新(QPaintEvent) |
QEvent::PaletteChange | 39 | 部件的调色板发生改变 |
QEvent::ParentAboutToChange | 131 | 部件的 parent 将要更改 |
QEvent::ParentChange | 21 | 部件的 parent 发生改变 |
QEvent::PlatformPanel | 212 | 请求一个特定于平台的面板 |
QEvent::PlatformSurface | 217 | 原生平台表面已创建或即将被销毁(QPlatformSurfaceEvent) |
QEvent::Polish | 75 | 部件被抛光 |
QEvent::PolishRequest | 74 | 部件应该被抛光 |
QEvent::QueryWhatsThis | 123 | 如果部件有“What’s This?”帮助,应该接受事件 |
QEvent::ReadOnlyChange | 106 | 部件的 read-only 状态发生改变 |
QEvent::RequestSoftwareInputPanel | 199 | 部件想要打开软件输入面板(SIP) |
QEvent::Resize | 14 | 部件的大小发生改变(QResizeEvent) |
QEvent::ScrollPrepare | 204 | 对象需要填充它的几何信息(QScrollPrepareEvent) |
QEvent::Scroll | 205 | 对象需要滚动到提供的位置(QScrollEvent) |
QEvent::Shortcut | 117 | 快捷键处理(QShortcutEvent) |
QEvent::ShortcutOverride | 51 | 按下按键,用于覆盖快捷键(QKeyEvent) |
QEvent::Show | 17 | 部件显示在屏幕上(QShowEvent) |
QEvent::ShowToParent | 26 | 子部件被显示 |
QEvent::SockAct | 50 | Socket 激活,用于实现 QSocketNotifier |
QEvent::StateMachineSignal | 192 | 信号被传递到状态机(QStateMachine::SignalEvent) |
QEvent::StateMachineWrapped | 193 | 事件是一个包装器,用于包含另一个事件(QStateMachine::WrappedEvent) |
QEvent::StatusTip | 112 | 状态提示请求(QStatusTipEvent) |
QEvent::StyleChange | 100 | 部件的样式发生改变 |
QEvent::TabletMove | 87 | Wacom 写字板移动(QTabletEvent) |
QEvent::TabletPress | 92 | Wacom 写字板按下(QTabletEvent) |
QEvent::TabletRelease | 93 | Wacom 写字板释放(QTabletEvent) |
QEvent::OkRequest | 94 | Ok 按钮在装饰前被按下,仅支持 Windows CE |
QEvent::TabletEnterProximity | 171 | Wacom 写字板进入接近事件(QTabletEvent),发送到 QApplication |
QEvent::TabletLeaveProximity | 172 | Wacom 写字板离开接近事件(QTabletEvent),发送到 QApplication |
QEvent::ThreadChange | 22 | 对象被移动到另一个线程。这是发送到此对象的最后一个事件在上一个线程中,参见:QObject::moveToThread() |
QEvent::Timer | 1 | 定时器事件(QTimerEvent) |
QEvent::ToolBarChange | 120 | 工具栏按钮在 OS X 上进行切换 |
QEvent::ToolTip | 110 | 一个 tooltip 请求(QHelpEvent) |
QEvent::ToolTipChange | 184 | 部件的 tooltip 发生改变 |
QEvent::TouchBegin | 194 | 触摸屏或轨迹板事件序列的开始(QTouchEvent) |
QEvent::TouchCancel | 209 | 取消触摸事件序列(QTouchEvent) |
QEvent::TouchEnd | 196 | 触摸事件序列结束(QTouchEvent) |
QEvent::TouchUpdate | 195 | 触摸屏事件(QTouchEvent) |
QEvent::UngrabKeyboard | 189 | Item 失去键盘抓取(QGraphicsItem) |
QEvent::UngrabMouse | 187 | Item 失去鼠标抓取(QGraphicsItem、QQuickItem) |
QEvent::UpdateLater | 78 | 部件应该排队在以后重新绘制 |
QEvent::UpdateRequest | 77 | 部件应该被重绘 |
QEvent::WhatsThis | 111 | 部件应该显示“What’s This”帮助(QHelpEvent) |
QEvent::WhatsThisClicked | 118 | 部件的“What’s This”帮助链接被点击 |
QEvent::Wheel | 31 | 鼠标滚轮滚动(QWheelEvent) |
QEvent::WinEventAct | 132 | 发生了 Windows 特定的激活事件 |
QEvent::WindowActivate | 24 | 窗口已激活 |
QEvent::WindowBlocked | 103 | 窗口被模态对话框阻塞 |
QEvent::WindowDeactivate | 25 | 窗户被停用 |
QEvent::WindowIconChange | 34 | 窗口的图标发生改变 |
QEvent::WindowStateChange | 105 | 窗口的状态(最小化、最大化或全屏)发生改变(QWindowStateChangeEvent) |
QEvent::WindowTitleChange | 33 | 窗口的标题发生改变 |
QEvent::WindowUnblocked | 104 | 一个模态对话框退出后,窗口将不被阻塞 |
QEvent::WinIdChange | 203 | 本地窗口的系统标识符发生改变 |
QEvent::ZOrderChange | 126 | 部件的 z 值发生了改变,该事件不会发送给顶层窗口 |
用户事件的值应该介于 QEvent:: 和 QEvent::MaxUser之间。
常量 | 值 | 描述 |
---|---|---|
QEvent::User | 1000 | 用户定义的事件 |
QEvent::MaxUser | 65535 | 最后的用户事件 ID |
为方便起见,可以使用 [static] int QEvent::registerEventType(int *hint* = -1)
函数来注册和存储一个自定义事件类型,这样做会避免意外地重用一个自定义事件类型。
事件(QEvent) | 信号(SIGNAL) | |
---|---|---|
与QObject的关系 | 由具体对象进行处理 | 由具体对象主动产生 |
对程序影响 | 改写事件处理函数可能导致程序行为发生改变 | 信号是否存在对应的槽函数不会改变程序行为 |
两者的联系 | 一般而言,信号在具体的事件处理函数中产生 |
信号和事件是两个不同层面的东西,发出者不同,作用不同。Qt中,所有的QObject的子类实例均可对事件接收和处理!