• 8824阅读
  • 16回复

关于eventFilter的使用 [复制链接]

上一主题 下一主题
离线bigapple88
 
只看楼主 正序阅读 楼主  发表于: 2009-12-06
大家看我一段QT代码:
bool MythSpinBox::eventFilter(QObject* o, QEvent* e)
{
    (void)o;

    if (e->type() == QEvent::FocusIn)
    {
        QColor highlight = colorGroup().highlight();
        editor()->setPaletteBackgroundColor(highlight);
        emit(changeHelpText(helptext));
    }
    else if (e->type() == QEvent::FocusOut)
    {
        editor()->unsetPalette();
    }

    if (e->type() != QEvent::KeyPress)
        return FALSE;

    bool handled = false;
    QStringList actions;
    if (gContext->GetMainWindow()->TranslateKeyPress("qt", (QKeyEvent *)e,
                                                     actions))
    {
        for (unsigned int i = 0; i < actions.size() && !handled; i++)
        {
            QString action = actions;
            handled = true;
            cout<<"+++cjq eventFilter action = "<<action<<endl;
            if (action == "LEFT")
            {
                cout<<"111111111111111111111"<<endl;
                return FALSE;
            }
            else if (action == "RIGHT")
            {
                cout<<"111111111111111111111"<<endl;
                return FALSE;
            }
            else if (action == "UP")
            {
                if (singlestep)
                    setValue(value() - 1);
                else
                    stepDown();
            }
            else if (action == "DOWN")
            {
                if (singlestep)
                    setValue(value() + 1);
                else
                    stepUp();
            }
            else if (action == "PAGEUP")
                stepDown();
            else if (action == "PAGEDOWN")
                stepUp();
            else if (action == "SELECT")
                handled = true;
            else if (action == "ESCAPE")
            {
                cout<<"111111111111111111111"<<endl;
                return FALSE;
            }
            else
                handled = false;
        }
    }

    return TRUE;
}

当按下LEFT 键和 ESCAPE键代码是相同的,可为什么在LEFT时可以打印出1111111111111(即LEFT事件在此处处理了),而ESCAPE时不能打印出1111111111111(ESCAPE事件没有在此处处理,交给父窗口处理了)?
我实际想要的结果是当按LEFT时不做处理,交给父窗口来处理,为什么同样的代码在ESCAPE时就可以,而LEFT时就不可以了呢?
很着急啊,谁懂啊?
[ 此帖被bigapple88在2009-12-06 17:26重新编辑 ]
离线bigapple88
只看该作者 16楼 发表于: 2009-12-07
大家好,问题解决了,因为QSpinBox中含有一个QLineEdit, 所有要忽略QSpinBox中的LEFT操作,要先对QLineEdit的keyPressEvent重载忽略LEFT操作,然后再在MythSpinBox::eventFilter中用return FALSE忽略LEFT操作,就可把控制交给父窗口实现了。
谢谢大家的帮助。
离线wd007

只看该作者 15楼 发表于: 2009-12-06
偶,问题似乎就在这里了。

你觉得没有起作用是什么原因,我是还没有想出来。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bigapple88
只看该作者 14楼 发表于: 2009-12-06
执行的是QSpinBox::keyPressEvent(e);
前面部分代码根本没起作用啊
离线wd007

只看该作者 13楼 发表于: 2009-12-06
if (!handled)
        QSpinBox::keyPressEvent(e);


这个最后执行了吗,调试的结果如何。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bigapple88
只看该作者 12楼 发表于: 2009-12-06
我对QSpinBox的keyPressEvent重载
void MythSpinBox::keyPressEvent(QKeyEvent* e)
{
    bool handled = false;
    QStringList actions;
    if (gContext->GetMainWindow()->TranslateKeyPress("qt", e, actions))
    {
        for (unsigned int i = 0; i < actions.size() && !handled; i++)
        {
            QString action = actions;
            handled = true;
cout<<"+++cjq MythSpinBox keyPressEvent action = "<<action<<endl;
            if (action == "LEFT")
                 e->ignore();
           else if (action == "RIGHT")
                e->ignore();
            else if (action == "UP")
            {
                if (singlestep)
                    setValue(value() - 1);
                else
                    stepDown();
            }
            else if (action == "DOWN")
            {
                if (singlestep)
                    setValue(value() + 1);
                else
                    stepUp();
            }
            else
                handled = false;
        }
    }

    if (!handled)
        QSpinBox::keyPressEvent(e);
}

重载没有起作用啊
离线wd007

只看该作者 11楼 发表于: 2009-12-06
QSpinBox只是对left做了处理,其它的键都没有吗。

对照一下各个键你的处理代码,看看。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bigapple88
只看该作者 10楼 发表于: 2009-12-06
是啊,其它按键都符合我的想法啊,就是这个LEFT按键啊
离线bigapple88
只看该作者 9楼 发表于: 2009-12-06
我的类MythSpinBox继承的是QSpinBox, 是不是因为QSpinBox本身对LEFT做了操作,所以就不能跳出来啊,我用keyPressEvent重载了LEFT操作,仍然不能跳出eventFilter中的LEFT
离线wd007

只看该作者 8楼 发表于: 2009-12-06
那是否可以得出一个结论,就是left键的处理没有交给父窗口,而其它键都实现了你的想法。

那么关键就是这个left键的处理了。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bigapple88
只看该作者 7楼 发表于: 2009-12-06
TranslateKeyPress()是我自己转换按键为action的函数。
把escape键的处理与left的处理对换一下位置后,结果没有变换,仍是按LEFT时就打印出了字符串,ESCAPE时就交给父窗口来处理了
离线wd007

只看该作者 6楼 发表于: 2009-12-06
是的,而且在if(){}里面有return FALSE;

TranslateKeyPress()这个方法就是你的父窗口的处理事件的地方,是吗。

程序大意我看得不是很清楚,你把那个escape键的处理与left的处理对换一下,看看这次如何。

先排除,再看看逻辑有没有错误。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bigapple88
只看该作者 5楼 发表于: 2009-12-06
语句结构没有问题吧,我是在for循环中处理的啊,按一次按键就会做一次循环啊,LEFT被处理后就跳出循环了
离线wd007

只看该作者 4楼 发表于: 2009-12-06
哦,一起探讨吧。

if else if else的语法定义如下:

if (表达式1)
{      如果表达式1的值为TRUE执行的语句  }
elseif (表达式2)
{      如果表达式1的值为FALSE,表达式2的值为TRUE执行的语句  }
else
{      如果表达式1和表达式2的值都为FALSE执行的语句  }

那么从你的源代码看,如果LEFT键被处理了,那么后面的else if 和else就不会执行了。

所以,你是否可以更改一下语句的判断方式。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bigapple88
只看该作者 3楼 发表于: 2009-12-06
调试的时候从打印信息可以看出,当按LEFT键时打印了字符串“1111111111111111”,而按ESCAPE时没有打印字符串,说明在按LEFT时仍处理了此事件,而ESCAPE时就没有处理啊,我想要的是按LEFT时也不处理,这样我才能在父窗口做控制
离线wd007

只看该作者 2楼 发表于: 2009-12-06
你调试时,得到的结论是怎样的,为什么那个键没有处理,应该能看到原因吧。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线bigapple88
只看该作者 1楼 发表于: 2009-12-06
有人知道吗,在线急等啊
快速回复
限100 字节
 
上一个 下一个