精华内容
下载资源
问答
  • Qt 焦点窗口

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

    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 焦点问题

    千次阅读 2018-09-30 11:04:44
    在写QT程序时,遇到焦点问题。在某个界面menu中,所有控件的焦点都已设置为NoFocus,按某个按键会弹出一个dialog,关闭dialog后,上下左右按键都不响应,无法进入keyPressEvent,查询发现,这几个按键可以切换焦点,...

            在写QT程序时,遇到焦点问题。在某个界面menu中,所有控件的焦点都已设置为NoFocus,按某个按键会弹出一个dialog,关闭dialog后,上下左右按键都不响应,无法进入keyPressEvent,查询发现,这几个按键可以切换焦点,当切换焦点时,则不会写响应keyPress事件,而本界面的控件都已设置为NoFocus,故编写了以下类,检测KeyPress事件,并打印获取焦点的控件。

    MyApp::MyApp(int &argc, char **argv, Type index) :
        QApplication(argc, argv, index)
    {

    }

    MyApp::MyApp(int &argc, char **argv) :
        QApplication(argc, argv)
    {

    }
    bool MyApp::notify(QObject *reciver, QEvent *e)
    {
        if(e->type() == QEvent::KeyPress)
        {
    //        qDebug()<<"key = "<<((QKeyEvent *)e)->key();
            QWidget *m_widget = QApplication::focusWidget();
            qDebug()<<m_widget->metaObject()->className();

        }
        return QApplication::notify(reciver, e);
    }

    在main函数中:

    原始:    QApplication a(argc, argv);

    替换为:    MyApp a(argc, argv);

            编译执行程序,通过调试发现,当出现上述问题时,打印的焦点所在控件为QPushButton,menu界面虽然有QPushButton,但都设置成了Nofocus,检查发现,在该界面有一个QDialogButtonBox,QDialogButtongBox类是一个包含很多按钮的控件,在对话框中有多个按钮需要分组排列的按钮时,可以使用QDialogButtongBox类。故这个控件即为问题所在,虽然该控件本身设置为NoFocus,但是由于其包含很多QPushButton控件,导致焦点聚焦在某个QPushButton而不响应keyPress事件。

            折腾了两天,发现是由于自己的马虎,添加了一个根本没用的控件,导致了这个问题,想想很是懊恼,还要深刻反省自己才是。

    展开全文
  • Qt焦点事件 setFocusPolicy

    千次阅读 2018-11-06 11:13:10
    首先来说说为什么要设置焦点吧。  设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。... setFocusPolicy ( Qt::Focus...

    首先来说说为什么要设置焦点吧。

      设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置了焦点。

    一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等)

    void

    setFocusPolicy ( Qt::FocusPolicy policy )

    设置获得焦点的方式

    ConstantValueDescription
    Qt::TabFocus0x1通过Tab键获得焦点
    Qt::ClickFocus0x2通过被单击获得焦点
    Qt::StrongFocusTabFocus | ClickFocus | 0x8可通过上面两种方式获得焦点
    Qt::WheelFocusStrongFocus | 0x4类似Qt::StrongFocus只不过再加上鼠标滑轮
    Qt::NoFocus0不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点.

    当前有焦点事件的窗口只能有一个,当一个窗口获取焦点事件或失去焦点事件时,可能需要相应的操作,或者如

    何判断一个才窗口有没有焦点事件。Qt中亦有相应的函数。

    void QWidget::focusInEvent ( QFocusEvent * event ) [virtual protected]

    void QWidget::focusOutEvent ( QFocusEvent * event ) [virtual protected]

    这两个就是窗口获取或失去焦点事件的函数,需要我们重写(好多窗口都是从QWidget继承这两个函数的)

    bool hasFocus () const

    这个函数就是判断当前窗口有没有焦点事件的,返回布尔值。

    void QWidget::setFocus ( Qt::FocusReason reason )

    void QWidget::clearFocus ()

    这两个函数就是设置或清除焦点事件的。

    ConstantValueDescription
    Qt::TabFocus0x1the widget accepts focus by tabbing.
    Qt::ClickFocus0x2the widget accepts focus by clicking.
    Qt::StrongFocusTabFocus | ClickFocus | 0x8the widget accepts focus by both tabbing and clicking. On Mac OS X this will also be indicate that the widget accepts tab focus when in 'Text/List focus mode'.
    Qt::WheelFocusStrongFocus | 0x4like Qt::StrongFocus plus the widget accepts focus by using the mouse wheel.
    Qt::NoFocus0the widget does not accept focus.

     

    展开全文
  • Qt 实现利用方向键控制光标在不同控件上移动(本资源控件为LineEdit),上下方向键可直接移动至上一个或下一个控件,左右方向键配合Ctrl键使用,本资源借鉴相关网络资源编写。
  • Qt焦点事件

    2017-11-20 17:08:49
    Qt焦点事件为了尝试得到Qt窗口得到或者失去焦点的事件,使用了两种方法尝试: 方法一:重载窗口的 focusInEvent 和 focusOutEvent。 .hprotected: virtual void focusInEvent(QFocusEvent * event); virtual ...

    Qt焦点事件

    为了尝试得到Qt窗口得到或者失去焦点的事件,使用了两种方法尝试:
    方法一:重载窗口的 focusInEvent 和 focusOutEvent。
    .h

    protected:
        virtual void focusInEvent(QFocusEvent * event);
        virtual void focusOutEvent(QFocusEvent * event);

    .cpp

    void ShapeWindow::focusInEvent(QFocusEvent *)
    {
        qDebug()<<"show";
        show();
    }
    
    void ShapeWindow::focusOutEvent(QFocusEvent *)
    {
        qDebug()<<"hide";
        hide();
    }

    方法二:使用 eventFilter 过滤。
    .h

    public slots:
        bool eventFilter(QObject *watched, QEvent *event);

    .cpp
    初始化时安装事件过滤:

        ui->widget_shape->installEventFilter(this);
        ui->widget_thick->installEventFilter(this);

    过滤函数:

    bool MainWindow::eventFilter(QObject *watched, QEvent *event)
    {
        qDebug()<<"eventFilter"<<event->type()<<endl;
        if(watched == ui->widget_shape)
        {
            qDebug()<<"eventFilter widget_shape "<<event->type()<<endl;
            if(event->type() == QEvent::FocusIn)
            {
              qDebug()<<"eventFilter widget_shape FocusIn"<<endl;
                ;
            }
            else if(event->type() == QEvent::FocusOut)
            {
                qDebug()<<"eventFilter widget_shape FocusOut"<<endl;
                ui->widget_shape->hide();
            }
        }
        else if(watched == ui->widget_thick)
        {
            qDebug()<<"eventFilter widget_thick "<<event->type()<<endl;
            if(event->type() == QEvent::FocusIn)
            {
                qDebug()<<"eventFilter widget_thick FocusIn"<<endl;
                ;
            }
            else if(event->type() == QEvent::FocusOut)
            {
                qDebug()<<"eventFilter widget_thick FocusOut"<<endl;
                ui->widget_thick->hide();
            }
        }
        return QMainWindow::eventFilter(watched,event);
    }

    widget默认是没有焦点的,此时使用上边两种方法都无法获取到焦点事件,需要设置窗口的 focusPolicy 属性,并在widget显示之后 setFocus()
    这里写图片描述

    void MainWindow::on_btn_thick_clicked()    //粗细
    {
        ui->widget_shape->hide();
        ui->widget_thick->show();
        ui->widget_thick->setFocus();
    }
    展开全文
  • QT 获取控件焦点

    千次阅读 2020-10-28 22:55:24
    本文通过QT过滤器来实现所有控件的获取焦点和离开焦点事件。 本文展示了两种类型的控件获取焦点和离开焦点事件的演示。 UI界面:4个LineEdit和4个Button控件 演示UI: mainwindow.h #include <...
  • 一、事件 1.如果一个事件不接受焦点,那么你按它没有任何反应 //将焦点赋予小部件,而不管其焦点策略如何,请注意 ...Qt::TabFocus //部件通过Tab键接受焦点 Qt::ClickFocus //部件通过单击接受焦点 Qt::St...
  • QT 切换焦点有很多种方式,比较常用的是通过Tab键, 那么按下Tab键后,界面的器件焦点切换顺序是怎么样的,又该怎么指定呢?
  • Qt控件焦点切换

    千次阅读 2017-05-25 17:29:29
    人们日常切换控件,例如QQ登陆...Qt中QWidget提供了一个静态方式实现该效果 其中也包含介绍使用[static] void QWidget::setTabOrder(QWidget *first, QWidget *second) Puts the second widget after the first widget
  • 按tab键,默认程序中获取焦点以后会有虚边框,使用样式表可以去除:setStyleSheet("*{outline:0px;}");
  • Qt设置回车焦点

    2020-11-25 09:40:42
    //设置默认焦点 ui.pushButton->setShortcut( QKeySequence::InsertParagraphSeparator ); //设置快捷键为键盘的“回车”键 ui.pushButton->setShortcut(Qt::Key_Enter); //设置快捷键为enter键 ui....
  • QT的基本控件的焦点定位及切换

    千次阅读 2019-08-29 23:02:22
    初始化控件的样式(按键-单选-多选-... //红框为焦点选中状态 ui->btn->setStyleSheet("QPushButton::focus {border: 3px solid #de291f; }"); ui->box->setStyleSheet("QCheckBox::focus {border...
  • Qt焦点策略FocusPolicy的使用

    千次阅读 2019-02-26 08:32:10
    Qt焦点策略FocusPolicy的使用 enum Qt::FocusPolicy This enum type defines the various policies a widget can have with respect to acquiring keyboard focus. 枚举类型定义了小部件在获取键盘焦点方面可以...
  • Qt界面focus焦点设置的一些体会

    千次阅读 2020-04-29 20:34:27
    首先要感谢这篇文章:【QT】新弹窗默认无焦点 给了我一个思路,我能不能在窗口show出来之后,或者show事件中知道当前的focus在哪个控件上? 如果你是界面是继承自QWidget的话: void ResetPasswordDialog::showEvent...
  • Qt Tab 切换焦点顺序

    2018-05-24 14:50:52
    QLineEdit * lineEdit1 = new QLineEdit(this);...如果加一句 lineEdit3->setFocusPolicy(Qt::NoFocus); //lineEdit3无焦点 结果是,虽然为lineEdit3设置了焦点切换顺序 但是直接跳过了lineEdit3
  • QT焦点设置(在构造函数最后)

    千次阅读 2013-10-17 15:22:54
    在我的前一篇文章中,我实现了QLineEdit获得焦点高亮显示与失去焦点恢复原样的操作,是通过重新继承该类,再重构该事件函数的方式。这篇文章紧跟那篇文章,这里要实现的功能也是一样的,而是通过另外不同的方式——...
  • QT的键盘事件及焦点设置

    千次阅读 2017-10-12 19:40:32
    Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效。下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子...
  • 描述:一开始我要实现的目的就是,在一个窗体上有多个可编辑控件(比如QLineEdit、QTextEdit等),当哪个控件获得焦点,哪个控件的背景就高亮用来起提示作用,查了下文档应该用focusInEvent()和focus
  • Qt之获得焦点的控件

    千次阅读 2019-12-11 17:49:46
    1. 获取获得焦点的控件 QWidget *myWidget=QApplication::focusWidget; 2. 判断控件属于哪个类 if(myWidget->inherits("QComboBox"){ } 3. 创建对象使之并为其赋值 QComboBox *cbb=qobject_cast<...
  • Qt焦点的控件出现虚线框

    千次阅读 2018-06-19 19:21:13
    在qss中加入: outline:none; 也可以把控件的 focusPolicy 改成 NoPolicy
  • Qt下的进程界面之间的鼠标焦点切换

    千次阅读 2019-01-06 21:02:22
    目录   需求 分析 需求(1) 需求(2) 定义通用变量 设计通信报文  ... 焦点切换 ...⑵ 在软件B、C都存在的条件下,按J键可以实现鼠标焦点以A-&gt;B-&gt;C的顺序在软件之间切换...
  • Qt自由切换焦点

    千次阅读 2016-11-04 23:35:45
    这次的项目中有个界面大概需要实现这样的一个功能:当我按键盘Tab键时,焦点在pushButton、pushButton_5、pushButton_9之间切换,当焦点停在pushButton、pushButton_5、pushButton_9之间某个按键时,此时按键盘的向...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,504
精华内容 3,001
关键字:

qt焦点