环境
Qt 5.15.2
功能
Qt 上下键切换焦点及显示自定义ToolTip
源码
1.mainwindow.h
class MainWindow : public QMainWindow
{Q_OBJECTpublic: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用于显示ToolTippLblToolTip = 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)
{// 阻止事件传播,从而不显示原本的ToolTipif(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);
}