环境
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);
}