Qt 急求回答

qq_34480269 2019-07-07 09:00:34
MyLineEdit::MyLineEdit(QWidget *parent) :
QLineEdit(parent)
{
}

void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
qDebug() << tr("MyLineEdit 键盘按下事件");
QLineEdit::keyPressEvent(event);
event->ignore();
}

void MyLineEdit::mousePressEvent(QMouseEvent *event)
{
qDebug() << "yyyy";
}

bool MyLineEdit::event(QEvent *event)
{
if(event->type() == QEvent::KeyPress) {
qDebug() << "xxxx";
QKeyEvent *ev = static_cast<QKeyEvent *>(event);
QLineEdit::keyPressEvent(ev);
return true;
}
//QObject::children();
return QLineEdit::event(event); // 为什么当我单机鼠标后还会输出“yyyy”。即我调用的明明是基类QLineEdit的event函数,而它却 不调用基类QLineEdit的mousePressEvent函数(因为我F11单步进入后qDebug() << "aaaa";),反而调用派生类的mousePressEvent而输出“yyyy”。
}

...全文
114 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
stherix 2019-07-08
  • 打赏
  • 举报
回复
父类的event里不是必须调用自己类的mousePressEvent啊 因为你没有定义 所以他执行的还是event的默认实现,就是去找各个事件的实现 而因为多态的关系,这时候控件指针还是指向MyLineEdit的,最终还是执行了MyLineEdit的mousePressEvent
弓人水 2019-07-08
  • 打赏
  • 举报
回复
如果你想阻断事件的分发,可以在event方法里面return true。

bool MyLineEdit::event(QEvent *event)
{
switch (event->type()) {
case QEvent::KeyPress:
qDebug() << "xxxx";
QKeyEvent *ev = static_cast<QKeyEvent *>(event);
QLineEdit::keyPressEvent(ev);
return true;

case QEvent::MouseButtonPress:
return true; // 只会拦截MouseButtonPress事件(mousePressEvent虚函数不会被调用)

return QLineEdit::event(event); // 如果把这里换成return true;则只会执行上面switch那些事件,其他事件都会被拦截
弓人水 2019-07-08
  • 打赏
  • 举报
回复
QLineEdit::event(event)为什么会执行派生类的mousePressEvent?
因为类似mousePressEvent这些虚函数都会在QLineEdit的基类QWidget中的event方法中被调用。
相当于event会分发mousePressEvent这些子事件。
看下QWidget的event方法源码片段,基本就能理解了:

bool QWidget::event(QEvent *event)
{
Q_D(QWidget);

// ignore mouse and key events when disabled
if (!isEnabled()) {
switch(event->type()) {
case QEvent::TabletPress:
case QEvent::TabletRelease:
case QEvent::TabletMove:
case QEvent::MouseButtonPress:
case QEvent::MouseButtonRelease:
case QEvent::MouseButtonDblClick:
case QEvent::MouseMove:
case QEvent::TouchBegin:
case QEvent::TouchUpdate:
case QEvent::TouchEnd:
case QEvent::TouchCancel:
case QEvent::ContextMenu:
case QEvent::KeyPress:
case QEvent::KeyRelease:
#ifndef QT_NO_WHEELEVENT
case QEvent::Wheel:
#endif
return false;
default:
break;
}
}
switch (event->type()) {
case QEvent::MouseMove:
mouseMoveEvent((QMouseEvent*)event);
break;

case QEvent::MouseButtonPress:
mousePressEvent((QMouseEvent*)event);
break;

case QEvent::MouseButtonRelease:
mouseReleaseEvent((QMouseEvent*)event);
break;

case QEvent::MouseButtonDblClick:
mouseDoubleCl
qq_34480269 2019-07-08
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
keyPress和mousePress是两回事啊
我知道,我的意思是在我实现的event函数中只对keyPress事件感兴趣并return true,但是当来一个mousePress事件时我直接return了父类的event函数。这个父类的event怎么可能调用子类的mousePressEvent()事件处理函数呢?这个父类QLineEdit的event函数不应该也调用(父类即)QLineEdit的mousePressEvent()么?
stherix 2019-07-08
  • 打赏
  • 举报
回复
keyPress和mousePress是两回事啊

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧