事件
处理流程
QApplication 先得到 ==> 具体应该处理的窗口:event() ==> event() 根据消息的类型来调用具体的虚函数
重载具体的虚函数来实现对消息的相应
重载 event 函数来处理或截取消息
具体流程
- 在处理的类里重载事件
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
// *************** event **********************
// bool event(QEvent *);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void closeEvent(QCloseEvent *event);
void hideEvent(QHideEvent *event);
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
// *********************************************
QPushButton *button;
QPushButton *button1;
QVBoxLayout *vlay;
QTextEdit * edit;
void sl_buttonChecked();
signals:
};
截断消息
重载event函数来处理或者截取消息
bool MyWidget::event(QEvent *ev)
{
if(ev->type() == QEvent::MouseButtonPress)
{
qDebug()<<"111";
return QWidget::event(ev);
}
}
重写 事件
重载具体的虚函数来实现对消息的相应
void MyWidget::keyPressEvent(QKeyEvent *event)
{
event->modifiers() ;
int key = event->key();
qDebug()<<key;
char keys = key;
qDebug()<<keys;
}
void MyWidget::mousePressEvent(QMouseEvent *event)
{
QPoint pt = event->pos();
qDebug()<<pt;
if(event->button() == Qt::LeftButton)
{
qDebug()<<"left";
}
if(event->modifiers()== Qt::ShiftModifier) // 修饰符shift
{
qDebug()<<"shift press";
}
if(event->modifiers() == Qt::ControlModifier)
{
qDebug()<<"control";
return ;
}
}
注意事项
鼠标事件在窗口上处理不包含按钮等部件 鼠标按下才会有反应
解决方法:
this->setMouseTracking(true);
* 键盘事件在主窗口上处理, 不会处理按键等
解决方法: 设置 焦点 or 将按键设置默认
button->setFocus(); // 设置焦点
button->setDefault(true); // 设为默认
事件过滤
给 Widget 安装一个消息过滤器, 经过 Widget 的消息都要先经过 eventfilter
button->installEventFilter(this);重写 eventFilter 函数
bool eventFilter(QObject *, QEvent *); bool MyWidget::eventFilter(QObject *o, QEvent *e) { if(((QPushButton *)_button == o ) && (e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseButtonDblClick|| e->type() == QEvent::MouseButtonPress)) { return true; } return QWidget::eventFilter(o,e); }