Qt的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘焦点,一个焦点移出事件会被发送给焦点窗口(如果有的话)告诉它关于焦点失去的事情.然后一个焦点进入事件被发送给这个窗口部件告诉它刚刚接收到焦点.

Qt的窗口部件在图形用户界面中按用户习惯的方式来处理键盘焦点.基本出发点是用户的点击能定向到屏幕上窗口的任何一个,和在窗口中任何一个部件中.当用户按下一个键,他们期望键盘焦点能够到达正确的位置,并且软件必须尽量满足这种希望.系统必须驱动点击定位在哪一个应用程序,应用程序中哪一个窗口和窗口中的哪一个窗口部件.

focus

一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。

焦点移动的方式有以下几种:

·按下Tab或Shift+Tab

注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等

Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。

·点击一个QWidget

建议:只对接受文本输入的Widget启用该功能

·按下键盘的快捷键

QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持

·使用鼠标滚轮

·用户移动焦点

程序将决定被设置focus的Widget的哪一个子Widget获得焦点

注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget

focusPolicy

一个QWidget获得焦点的方式受 focusPolicy 控制

Qt::TabFocus:通过Tab键获得焦点

Qt::ClickFocus:通过被单击获得焦点

Qt::StrongFocus:可通过上面两种方式获得焦点

Qt::NoFocus:不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点

keypress和keyrelease

首先,我们要是Widget获得焦点,一般设置focusPolicy。然后要对按键进行响应,我们只需要直接重载:

·keyPressEvent

·keyReleaseEvent

对我们不处理的事件,要调用父类的相应事件处理函数。

如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。

有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。

QKeyEvent

在windows下,与键盘事件有关的有8个消息:

·对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息

·有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。

这些消息在Qt中只体现在QKeyEvent中。

·对字符,可通过 QKeyEvent::text() 获得

·其他键,QKeyEvent::key() 获得一个键值

实际程序:

public: void keyPressEvent(QKeyEvent  *event);

在相应键盘事件之前需要 用一个widget 进行设置   LabelComment->setFocusPolicy(Qt::StrongFocus);

void CameraShow::keyPressEvent(QKeyEvent  *event) 
     if(event->key()==Qt::Key_Q) 
        Pause_flag  ^= 1; 

   在Qt中,可以使用 void QWidget::keyPressEvent ( QKeyEvent * k )来进行键盘响应,例如:

void Form1::keyPressEvent( QKeyEvent *k ) 
    if(k->key() == Key_A) 
      this->focusNextPrevChild(FALSE);//按A时焦点切换至上一部件 
    else if(k->key() == Key_D) 
      this->focusNextPrevChild(TRUE);//按D时焦点切换至下一部件 
    else if(k->key() == Key_W) 
      if(k->state() == Qt::ShiftButton) 
         this->resize(100,100);//当按下Shift+W时改变窗口大小 

   但是,有一些特殊的按键比如说Tab键,如果在keyPressEvent中实现则是不能成功的,因为默认Tab事件(切换焦点)被先捕获了,默认Tab和Shift+Tab事件定义在qwidget.h中,代码为:

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(); 

   所以我们要在之前就实现我们自己的Tab事件.实现代码如下:

bool MyWidget::event(QEvent *event)
if (event->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast(event);
if (ke->key() == Qt::Key_Tab) {
// special tab handling here
return true;
} else if (event->type() == MyCustomEventType) {
MyCustomEvent *myEvent = static_cast(event);
// custom event handling here
return true;
return QWidget::event(event); }

QTextBrowser中的网址切换 

void ALMTextView::keyPressEvent(QKeyEvent* e) 
   AMDEBUG("ALMTextView special key event/n"); 
   QScrollBar *sbv = verticalScrollBar(); 
    switch( e->key() ) { 
        //case Key_Right: 
        case Key_Down: 
            if ( !selectNextPrevHref( TRUE ) ) 
                // scroll the screen down by one page 
            if (sbv->value() == sbv->maxValue()) 
                printf("asdasdasdasdasdasda/n"); 
                this->focusNextPrevChild(TRUE); 
                sbv->setValue( sbv->value() + (sbv->pageStep() >> 1) ); 
                selectNextPrevHref( TRUE ); 
            e->accept(); 
            return; 
        //case Key_Left: 
        case Key_Up: 
            if ( !selectNextPrevHref( FALSE ) ){ 
                // scroll the screen up by one page 
                if(sbv->value() == 0) 
                        printf("1234567890/n"); 
                        this->focusNextPrevChild(FALSE); 
                sbv->setValue( sbv->value() - (sbv->pageStep() >> 1) ); 
                selectNextPrevHref( FALSE ); 
            e->accept(); 
            return; 
    QTextView::keyPressEvent(e); 

--------------------- 本文来自 冷月醉雪 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lengyuezuixue/article/details/81055288?utm_source=copy

Qt的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘焦点,一个焦点移出事件会被发送给焦点窗口(如果有的话)告诉它关于焦点失去的事情.然后一个焦点进入事件被发送给这个窗口部件告诉它刚刚接收到焦点.Qt的窗口部件在图形用户界面中按用户习惯的方式来处理键盘焦点.基本出发点是用户的点击能定向到屏幕上窗口的任何一个,和在窗口中任何一个部件中.当用户按下一个键,他们期望键盘焦点能够到达正确的位置,并...
实现功能: 1. 实现串口的自动检测,可接受和发送ASCII码字符串,支持发送接受汉字; 2. 实现发送和接收16进制字符(支持汉字),可显示发送和接受的时间,可自动换行及焦点锁定最后一行; 3. 实现状态栏显示发送和接受字节数,以及串口状态,可记录上次设置选项; 4. 重复发送时可设置发送间隔时间,实现每隔T ms发送一次消息,可记录以往发送的消息记录,点击可添加到发送区。 5. 界面控件可自行扩展铺满窗口,设置窗口背景颜色和图标
首先来说说为什么要设置焦点吧。 设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置了焦点。 一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等) setFocusPolicy( Qt::FocusPolicypolicy) 设置获得焦点的方式 Constant Value Desc...
Qt窗口部件在图形用户界面中按用户的习惯的方式来处理键盘焦点。基本出发点是用户的击键能定向到屏幕上窗口中的任何一个,和在窗口中任何一个部件中。当用户按下一个键,他们期望键盘焦点能够到达正确的位置,并且软件必须尽量满足这种希望。系统必须确定击键定位在哪一个应用程序、应用程序中的哪一个窗口窗口中的哪一个窗口部件。 1、焦点移动的方式 把焦点定位特殊的窗口部件的习惯方式有:
1.实际开发碰到的场景: 对于Qt的控件,如QLineEdit,QSpinbox,QPushButton等等,可以通过键盘的Tab按键获得焦点,可能在某些时候并不希望如此。 2.错误记录: QWidget的setFocusPolicy方法为默认Qt::StrongFocus,即用户可以通过tab获得焦点,也可以通过鼠标点击获得焦点。于是,修改了其默认属性,setFocusPolicy为Qt::...
今天来为大家分享一个小功能,首先看实现的效果吧~功能讲解:QLineEdit控件进行文本编辑,点击保存按钮后,隐藏编辑框和保存按钮,仅展示编辑内容,当鼠标点击空白处时,同样隐藏编辑框、隐藏保存按钮,但不存储编辑文本如果你要需要实现这样的功能,就继续往下看吧~三个控件:QLineEdit编辑框、QPushButton按钮、QLabel纯文本展示。默认QLabel控件是隐藏状态,只有点击保存按钮以及失去焦点后才会展示。此时需要响应两个消息。消息1:点击保存按钮 connect(ui.btnSave, 
QTableView *tableView = new QTableView(this); tableView->setModel(model); tableView->setFocus(); 这将使QTableView成为焦点窗口,并使其具有键盘焦点。您还可以使用QTableView的setFocusPolicy()方法来设置QTableView的焦点策略,以指定它如何接受焦点。例如,您可以设置为NoFocus,这个选项将禁用QTableView接受键盘焦点
视觉slam十四讲(ch6) Ubuntu18.04安装 g2o库 报错error: FixedArray ... has no member named ‘fill’ ulfaker: 麻烦问下你用旧版本g2o没有遇到这个问题马 ‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’ error: ‘make_unique’ is not a member of ‘g2o’; did you mean ‘std::make_unique’? 91 | g2o::make_unique<BlockSolverType>(g2o::make_unique<LinearSolverType>())); ‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘ git clone 所有分支,并push到另一个repo zuoanyx: git clone --mirror 一下就好了 vmware 虚拟机安装系统成功,没有虚拟网卡的完美解决方法 qq_43137586: 按步骤一步一步来,结果成功安装vmware,谢谢!!! 深蓝学院激光slam理论与实践 -第二章(里程计标定)作业 MUQI_X: 博主,能把odom_ws工作空间包或者作业包发我下吗表情包 邮箱是:923984159@qq.com 谢谢谢谢谢谢博主啦表情包表情包表情包 ubuntu 安装使用eigen3 (两种方式) weixin_48963517: 编译生成可执行文件时的名字是不能与当前目录下其他文件的名字相同的