QT串口工具(3)

        在做好界面的布局后,开始对各个控件的处理。

        首先是QTextEdit *com_data_edit, 串口接收数据窗口,同时也可以在此编辑框里实现键盘输入转换成串口输出。在默认的情况下,QTextEdit的字符输入会直接在其窗口显示,而且会有鼠标右健菜单,鼠标中键的粘贴功能。在我的设计中,需要拦截键盘按键事件,拦截到的键盘按键直接通过串口发送出去;需要屏蔽鼠标右键菜单的粘贴功能,鼠标中键的粘贴功能。关于拦截键盘按键,网上查找到用事件过滤器的办法来处理。先在工程的Widget类里重载bool eventFilter(QObject *obj, QEvent *event),这是QOjbect的事件过滤器函数。设置com_data_edit使用事件过滤器:com_data_edit->installEventFilter(this)。重载的eventFilter具体实现如下:

bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == com_data_edit)
    {
        //qDebug ("edit %d", event->type());
        if (event->type() == QEvent::KeyPress)//拦截com_data_edit的键盘按下事件,拦截成功返回true
        {
            QKeyEvent *keyEvent = static_cast(event);
            qDebug ("key %d", keyEvent->key());
            return true;
        }
        else if (event->type() == QEvent::KeyRelease)//拦截com_data_edit的键盘释放事件,拦截成功返回true
        {
            QKeyEvent *keyEvent = static_cast(event);
            qDebug ("key %d", keyEvent->key());
            return true;
        }
    }
    return false;//return QWidget::eventFilter(target, event);
}
关于鼠标右健及中键粘贴功能,网上有重载相关的控件类,在弹出菜单事件中先备份粘贴板,然后清除,最后再恢复粘贴板,这个方法可以解决鼠标右健粘贴问题。关于鼠标中键,虽然在事件过滤器中屏蔽此按键,但是在com_data_edit中还是会粘贴,不知是否是bug。后来调用com_data_edit->setReadOnly(true);后,解决鼠标中键,右健粘贴问题,不用去过滤器里面处理,同时还保留了鼠标右健的copy功能。

        其次,设置剩余的控件。剩下的控件没有什么特别的地方,在此暂时略过。

        关于事件过滤器,下面摘录自“Qt学习之路(22): 事件过滤器  -- http://devbean.blog.51cto.com/448512/231861/“

“如果一个组件安装了多个过滤器,则最后一个安装的会最先调用,类似于堆栈的行为。

注意,如果你在事件过滤器中delete了某个接收组件,务必将返回值设为true。否则,Qt还是会将事件分发给这个接收组件,从而导致程序崩溃。

事件过滤器和被安装的组件必须在同一线程,否则,过滤器不起作用。另外,如果在install之后,这两个组件到了不同的线程,那么,只有等到二者重新回到同一线程的时候过滤器才会有效。

事件的调用最终都会调用QCoreApplication的notify()函数,因此,最大的控制权实际上是重写QCoreApplication的notify()函数。由此可以看出,Qt的事件处理实际上是分层五个层次:重定义事件处理函数,重定义event()函数,为单个组件安装事件过滤器,为QApplication安装事件过滤器,重定义QCoreApplication的notify()函数。这几个层次的控制权是逐层增大的。“

参考:

Qt学习之路(22): 事件过滤器  -- http://devbean.blog.51cto.com/448512/231861/

Qt QLineEdit中屏蔽粘贴功能-- http://blog.sina.com.cn/s/blog_800142d90100v62v.html

你可能感兴趣的:(QT)