Qt 上下键切换焦点及显示自定义ToolTip

环境

Qt 5.15.2

功能

Qt 上下键切换焦点及显示自定义ToolTip
请添加图片描述

源码

1.mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
private:
    QLabel *pLblToolTip;   //自定义ToolTip

/* 事件过滤器 */
private:
    void InitEventFilter();
protected:
    bool eventFilter(QObject *obj, QEvent *event);
};

2.mainwindow.cpp



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建一个Label用于显示ToolTip
    pLblToolTip = new QLabel(this);
    pLblToolTip->setVisible(false);

    //设置Label样式
    QGraphicsDropShadowEffect *pShadow = new QGraphicsDropShadowEffect();
    pShadow->setColor(QColor(100,100,100));
    pShadow->setBlurRadius(1);
    pShadow->setOffset(1);

    pLblToolTip->setGraphicsEffect(pShadow);  /* 设置阴影 */
    pLblToolTip->setWindowFlags(Qt::Window | Qt::WindowStaysOnTopHint);  /* 显示在最上面 */
    pLblToolTip->setStyleSheet("border:1px solid rgb(90,90,90);background-color: rgb(240, 240, 240);color: rgb(90, 90, 90)");

    InitEventFilter();

}

void MainWindow::InitEventFilter()
{
    /* 所有LineEdit添加事件过滤器 */
    foreach (QLineEdit* lineEdit, this->findChildren<QLineEdit*>())
    {
        lineEdit->installEventFilter(this);
    }
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    // 阻止事件传播,从而不显示原本的ToolTip
    if(event->type() == QEvent::ToolTip) { return true; }

    if(!obj->inherits("QLineEdit"))
    {
        return QMainWindow::eventFilter(obj, event);
    }
    switch(event->type())
    {
     /* FocusIn  显示ToolTip  */
     case QEvent::FocusIn:{

       if(obj->inherits("QLineEdit"))  //FocusIn 时显示Label
       {
           QLineEdit* pLineEdit = qobject_cast<QLineEdit*>(obj);

           QPoint point  = pLineEdit->pos();

           pLblToolTip->setParent(qobject_cast<QWidget*>(obj->parent()));
           pLblToolTip->setText(pLineEdit->toolTip());
           pLblToolTip->move(QPoint(point.x()+5, point.y()+pLineEdit->height()/3*2));
           pLblToolTip->setVisible(true);

       }

     }break;
     /* FocusOut 关闭ToolTip */
     case QEvent::FocusOut:{
         pLblToolTip->setVisible(false);
     }break;

     /* 上下键切换焦点 */
     case QEvent::KeyPress:{

          QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

          switch(keyEvent->key())
          {
            case Qt::Key_Up:{

                if(obj->objectName() == "lineEdit_Param1")
                {
                   ui->lineEdit_Param10->setFocus();
                }else if(obj->objectName() == "lineEdit_Param2")
                {
                   ui->lineEdit_Param1->setFocus();
                }else if(obj->objectName() == "lineEdit_Param3")
                {
                   ui->lineEdit_Param2->setFocus();
                }else if(obj->objectName() == "lineEdit_Param4")
                {
                   ui->lineEdit_Param3->setFocus();
                }else if(obj->objectName() == "lineEdit_Param5")
                {
                   ui->lineEdit_Param4->setFocus();
                }else if(obj->objectName() == "lineEdit_Param6")
                {
                   ui->lineEdit_Param5->setFocus();
                }else if(obj->objectName() == "lineEdit_Param7")
                {
                   ui->lineEdit_Param6->setFocus();
                }else if(obj->objectName() == "lineEdit_Param8")
                {
                   ui->lineEdit_Param7->setFocus();
                }else if(obj->objectName() == "lineEdit_Param9")
                {
                   ui->lineEdit_Param8->setFocus();
                }else if(obj->objectName() == "lineEdit_Param10")
                {
                   ui->lineEdit_Param9->setFocus();
                }

            }break;
            case Qt::Key_Down:{

              if(obj->objectName() == "lineEdit_Param1")
              {
                  ui->lineEdit_Param2->setFocus();
              }else if(obj->objectName() == "lineEdit_Param2")
              {
                  ui->lineEdit_Param3->setFocus();
              }else if(obj->objectName() == "lineEdit_Param3")
              {
                  ui->lineEdit_Param4->setFocus();
              }else if(obj->objectName() == "lineEdit_Param4")
              {
                  ui->lineEdit_Param5->setFocus();
              }else if(obj->objectName() == "lineEdit_Param5")
              {
                  ui->lineEdit_Param6->setFocus();
              }else if(obj->objectName() == "lineEdit_Param6")
              {
                  ui->lineEdit_Param7->setFocus();
              }else if(obj->objectName() == "lineEdit_Param7")
              {
                  ui->lineEdit_Param8->setFocus();
              }else if(obj->objectName() == "lineEdit_Param8")
              {
                  ui->lineEdit_Param9->setFocus();
              }else if(obj->objectName() == "lineEdit_Param9")
              {
                  ui->lineEdit_Param10->setFocus();
              }else if(obj->objectName() == "lineEdit_Param10")
              {
                  ui->lineEdit_Param1->setFocus();
              }
            }break;
            default:break;
          }
     }break;

     /* 输入关闭ToolTip */
     case QEvent::InputMethod:{
         pLblToolTip->setVisible(false);
     }break;
     default:break;
    }
    return QMainWindow::eventFilter(obj, event);
}

运行

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值