荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjksam (<font color=green><b>Love</b></font>), 信区: Linux
标  题: [转载] QTerm 1.3 Tab问题的修正(转寄)
发信站: 荔园晨风BBS站 (Fri Nov  2 16:45:44 2001), 转信

【 以下文字转载自 jjksam 的信箱 】
【 原文由 jjksam@smth.org 所发表 】
发信人: hwang (想想再说), 信区: Linux
标  题: QTerm 1.3 Tab问题的修正
发信站: BBS 水木清华站 (Thu Nov  1 15:28:35 2001)

这个问题的发生是因为QWidget在派送事件时把TAB键作为切换焦点的功能键, 请看
Qt 2.3.0源码/kernel/qwidget.cpp的第3910行:

        case QEvent::KeyPress: {
            QKeyEvent *k = (QKeyEvent *)e;
            bool res = FALSE;
            if ( k->key() == Key_Backtab ||
                 (k->key() == Key_Tab &&
                  (k->state() & ShiftButton)) ) {
                QFocusEvent::setReason( QFocusEvent::Tab );
                res = focusNextPrevChild( FALSE );
                QFocusEvent::resetReason();

            } else if ( k->key() == Key_Tab ) {
                QFocusEvent::setReason( QFocusEvent::Tab );
                res = focusNextPrevChild( TRUE );
                QFocusEvent::resetReason();
            }
            if ( res )
                break;
            ~~~~~~~~~~~~如果成功, 下面分发事件的代码就不执行了.
            QWidget *w = this;
            while ( w ) {
                w->keyPressEvent( k );
                if ( k->isAccepted() || w->isTopLevel() )
                    break;
                w = w->parentWidget();
                k->accept();
            }
            }
            break;

最简单的修改方法是重载虚函数focusNextPrevChild(),让它直接返回FALSE. 因此:
在qtermwindow.h中给QTermWindow加一个protected方法:

        bool focusNextPrevChild(bool next);

在qtermwindow.cpp的最后加上一段代码:

    bool QTermWindow::focusNextPrevChild(bool next)
    {
            return FALSE;
    }

这样编译后就可以了.
另外还有各小错误, QTermWindow::font()中的re = new ...这一句应该移到if{ }
里面来.

--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 210.83.151.219]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店