ui->setupUi(this);
ui->lineEdit->installEventFilter(this); //在窗体上为lineEdit1安装过滤器
ui->lineEdit_2->installEventFilter(this); //在窗体上为lineEdit_2安装过滤器
ui->lineEdit_3->installEventFilter(this); //在窗体上为lineEdit_3安装过滤器
ui->lineEdit_4->installEventFilter(this); //在窗体上为lineEdit_4安装过滤器
ui->pushButton->installEventFilter(this); //在窗体上为pushButton安装过滤器
ui->pushButton_2->installEventFilter(this); //在窗体上为pushButton_2安装过滤器
ui->pushButton_3->installEventFilter(this); //在窗体上为pushButton_3安装过滤器
ui->pushButton_4->installEventFilter(this); //在窗体上为lineEdit2安装过滤器
ui->lineEdit->setStyleSheet("#lineEdit{background-color:rgb(134,183,200);border:2px solid #5F92B2;border-radius:5px;color:white;}"
//hover 鼠标停留样式
"#lineEdit:hover{background-color:rgb(0,130,150);border:2px solid #5F92B2;border-radius:5px;color:white;}"
//pressed 鼠标点击样式
"#lineEdit:pressed{background-color:rgb(85,170,255);border:2px solid #3C80B1;border-radius:5px;color:white;}"
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
//感觉游戏里面的语言检测就是离开焦点做的...给你替换成***
if (watched==ui->lineEdit) //首先判断控件(这里指 lineEdit1)
if (event->type()==QEvent::FocusIn) //然后再判断控件的具体事件 (这里指获得焦点事件)
ui->lineEdit->setText("获取到焦点");
else if (event->type()==QEvent::FocusOut) // 这里指 lineEdit1 控件的失去焦点事件
ui->lineEdit->setText("离开焦点");
if (watched==ui->lineEdit_2) //这里来处理 lineEdit2 , 和处理lineEdit1 是一样的
if (event->type()==QEvent::FocusIn)
ui->lineEdit_2->setText("获取到焦点");
else if (event->type()==QEvent::FocusOut)
ui->lineEdit_2->setText("离开焦点");
if (watched==ui->lineEdit_3) //这里来处理 lineEdit3 , 和处理lineEdit1 是一样的
if (event->type()==QEvent::FocusIn)
ui->lineEdit_3->setText("获取到焦点");
else if (event->type()==QEvent::FocusOut)
ui->lineEdit_3->setText("离开焦点");
if (watched==ui->lineEdit_4) //这里来处理 lineEdit4 , 和处理lineEdit1 是一样的
if (event->type()==QEvent::FocusIn)
ui->lineEdit_4->setText("获取到焦点");
else if (event->type()==QEvent::FocusOut)
ui->lineEdit_4->setText("离开焦点");
if (watched==ui->pushButton) //这里来处理 Button , 和处理lineEdit1 是一样的
if (event->type()==QEvent::FocusIn)
ui->pushButton->setStyleSheet("#pushButton{background-color:rgb(100,205,196);}");
ui->pushButton->setText("一加8T青域");
else if (event->type()==QEvent::FocusOut)
ui->pushButton->setStyleSheet("");
ui->pushButton->setText("PushButton");
if (watched==ui->pushButton_2) //这里来处理 pushButton_2 , 和处理lineEdit1 是一样的
if (event->type()==QEvent::FocusIn)
ui->pushButton_2->setStyleSheet("#pushButton_2{background-color:rgb(100,205,196);}");
ui->pushButton_2->setText("一加8T青域");
else if (event->type()==QEvent::FocusOut)
ui->pushButton_2->setStyleSheet("");
ui->pushButton_2->setText("PushButton");
if (watched==ui->pushButton_3) //这里来处理 pushButton_3 , 和处理lineEdit1 是一样的
if (event->type()==QEvent::FocusIn)
ui->pushButton_3->setStyleSheet("#pushButton_3{background-color:rgb(100,205,196);}");
ui->pushButton_3->setText("一加8T青域");
else if (event->type()==QEvent::FocusOut)
ui->pushButton_3->setStyleSheet("");
ui->pushButton_3->setText("PushButton");
if (watched==ui->pushButton_4) //这里来处理 pushButton_4 , 和处理lineEdit1 是一样的
if (event->type()==QEvent::FocusIn)
ui->pushButton_4->setStyleSheet("#pushButton_4{background-color:rgb(100,205,196);}");
ui->pushButton_4->setText("一加8T青域");
else if (event->type()==QEvent::FocusOut)
ui->pushButton_4->setStyleSheet("");
ui->pushButton_4->setText("PushButton");
return QWidget::eventFilter(watched,event); // 最后将事件交给上层对话框
相信大家在看完张UI图片和代码后应该就知道其它控件怎么获取焦点了。
当然还有一个问题就是如果控件不需要执行代码只需要做一些特效,这样还是使用样式表中的Hover停留和Pressed点击直接响应比较好点。
前言:转载请附上连接,本帖原创请勿照抄。 本文通过QT过滤器来实现所有控件的获取焦点和离开焦点事件。 本文展示了两种类型的控件获取焦点和离开焦点事件的演示。UI界面:4个LineEdit和4个Button控件演示UI:mainwindow.h #include <QRegExpValidator>private slots: bool eventFilter(QObject *,QEvent *);mainwindow.c...
初始化控件的样式(按键-单选-多选-标签-QTableWidget-QDateTime)
//红框为焦点选中状态
ui->btn->setStyleSheet("QPushButton::focus {border: 3px solid #de291f; }");
ui->box->setStyleSheet("QCheckBox::focus {border...
Qt的事件模型中提供的事件过滤功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器可以在事件到达该对象前捕获事件,从而起到监视该对象事件的效果。
实现类似功能的另一种方式是通过分别继承不同的控件类,并重构各控件的事件响应函数,但若窗体中包含大量不同的控件时,每一个控件都必须重新继承,然后分别重构不同的事件函数,实现比较复杂。事件过滤
Qt的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘
焦点。基本出发点是用户的击键能定向到屏幕上窗口中的任何一个,和在窗口中任何一个部件中。当用户按下一个键,他们期望键盘
焦点能够到达正确的位置,并且软件必须尽量满足这种希望。系统必须确定击键定位在哪一个应用程序、应用程序中的哪一个窗口和窗口中的哪一个窗口部件。
1、
焦点移动的方式
把
焦点定位特殊的窗口部件的习惯方式有:
项目场景:最近写了个Dialog界面,其中有两个SpinBox控件,监测SpinBox值变化时,重新执行计算,锁定了键盘输入,只响应键盘上下键和回车,但点击回车总是执行的清空数据方法。
通过设置Focus策略解决。
首先来说说为什么要设置焦点吧。
设置焦点可以让应用更便捷。比如当你打开百度主页或其他带有编辑框的页面时,不需要先用鼠标点击编辑框就可以直接输入文字等信息到其中。这就是由于搜索框设置了焦点。
一个空间要先设置它焦点事件的模式,即窗口如何接受焦点事件(通过鼠标单击、Tab键、不接受焦点事件等)
setFocusPolicy( Qt::FocusPolicypolicy)
设置获得焦点的方式
Constant
Value
Desc...
#QtCustomWidgets 说明格式如下: 项目名称 编译环境 运行截图 注意事项
#ColorProgressBar 多彩进度条 编译环境: Qt5.x + mingw-QtCreater 运行截图: progressbarcolor为原版代码
#DynamicProgressBar 多态进度条 编译环境: Qt5.x + mingw-QtCreater 运行截图:
#RoundProgressBar 编译环境: Qt5.x + mingw-QtCreater 运行截图:
#SlideNavigation 滑动导航条 编译环境: Qt5.x + mingw-QtCreater 运行截图:
#SlideNavigationApp 滑动导航界面 编译环境: Qt5.x + mingw-QtCreater 运行截图: 注意事项: 此工程需要用到SlideNavigation这个工程中的2个文件slidenavigation.h和slidenavigation.cpp文件,不知道在如何引用,知道的希望留言帮助下
#RotateCircle 旋转的圆 编译环境: Qt5.x + mingw-QtCreater 运行截图:
#ImageViewer 旋转的圆 编译环境: Qt5.x + mingw-QtCreater 运行截图:
#CurveChart 简单曲线图 编译环境: Qt5.x + mingw-QtCreater 运行截图:
今天调试登录框的时候,发现登录框出现的时候,发现focus不在密码输入框中。就四处查焦点问题,以及tab键的焦点调转顺序。
首先要感谢这篇文章:【QT】新弹窗默认无焦点
给了我一个思路,我能不能在窗口show出来之后,或者show事件中知道当前的focus在哪个控件上?
如果你是界面是继承自QWidget的话:
void ResetPasswordDialog::showEvent(QShowEv...
可以使用 QWidget::mapToGlobal() 函数将控件的坐标转换为相对于屏幕的坐标。具体代码如下:
QPoint globalPos = widget->mapToGlobal(widget->pos());
int x = globalPos.x();
int y = globalPos.y();