怎么实现QLabel或者QLineEdit得到焦点时背景色闪烁

__阿飞__ 2012-10-26 03:07:00
本人最近在做的界面,有些输入控件,需要友好的显示给用户,达到的效果是:

用户点击某个QLabel或者QLineEdit之后,QLabel/QLineEdit就会背景色开始闪烁,比如白色红色交替闪烁,提示用户输入,这个要怎么实现呢?想了很久,我个人没想到好的解决办法,不晓得各位有啥方法呢?

我目前只实现到重写了QLineEdit的focusInEvent(QFocusEvent *e)方法,给QLineEdit背景色改变下,但是效果是得到焦点变色,并没有闪烁,现在就是想怎么能获得焦点后两个背景颜色交替闪烁起来呢?

更深入一点的是,如果用户输入的数据偏小或者有问题,输入的内容也闪烁,这个都要如何去实现?

有人可以提供些思路或者好办法么?谢谢!
...全文
1085 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiachm 2012-10-26
  • 打赏
  • 举报
回复
不错,另外提醒一下,应该把事件传递给父类,否则会造成光标丢失等现象:

void CLineEdit::focusInEvent(QFocusEvent *event)
{
......

QLineEdit::focusInEvent(event);
}

void CLineEdit::focusOutEvent(QFocusEvent *event)
{
......

QLineEdit::focusOutEvent(event);
}
__阿飞__ 2012-10-26
  • 打赏
  • 举报
回复
谢谢老师啊,结贴了,效果图如下,又学了很多东西,哈哈
__阿飞__ 2012-10-26
  • 打赏
  • 举报
回复
额,老师太好了,我意思是说经过老师这么一指点,我按照你的方法来写的话比我自己想的办法代码量小的多,没想到老师直接给我贴代码了,谢谢哦,看着你的代码,我这里处理可能没你简洁:
setStyleSheet(styleSheet().isEmpty() ? "background-color: red" : "");

我之前没见过这种写法,要是我,可能这么写:

CLineEdit::CLineEdit(QWidget *parent)
: QLineEdit(parent)
{
m_timer.setInterval(400);
connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimer()));
flag = 0;
}

void CLineEdit::onTimer()
{
if (flag) {
setStyleSheet("background-color: red");
}
}

void CLineEdit::focusInEvent(QFocusEvent *)
{
flag = 1;
m_timer.start();
}

void CLineEdit::focusOutEvent(QFocusEvent *)
{
flag = 0;
m_timer.stop();
setStyleSheet("");
}

不过接触Qt才不到1个月,现在对Qt的整个工作机制是熟悉了,具体细节,有待跟大家一起交流进步,在这里谢谢老师了!
[Quote=引用 6 楼 的回复:]

C/C++ code

CLineEdit::CLineEdit(QWidget *parent)
: QLineEdit(parent)
{
m_timer.setInterval(400);
connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimer()));
}

void CLineEdit::onTi……
[/Quote]
xiachm 2012-10-26
  • 打赏
  • 举报
回复
哈哈,还有更简单的:

CLineEdit::CLineEdit(QWidget *parent)
: QLineEdit(parent), m_timer(0)
{
}

void CLineEdit::focusInEvent(QFocusEvent *)
{
m_timer = startTimer(300);
}

void CLineEdit::focusOutEvent(QFocusEvent *)
{
setStyleSheet("");
killTimer(m_timer);
}

void CLineEdit::timerEvent(QTimerEvent *)
{
setStyleSheet(styleSheet().isEmpty() ? "background-color: red" : "");
}
xiachm 2012-10-26
  • 打赏
  • 举报
回复

CLineEdit::CLineEdit(QWidget *parent)
: QLineEdit(parent)
{
m_timer.setInterval(400);
connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimer()));
}

void CLineEdit::onTimer()
{
setStyleSheet(styleSheet().isEmpty() ? "background-color: red" : "");
}

void CLineEdit::focusInEvent(QFocusEvent *)
{
m_timer.start();
}

void CLineEdit::focusOutEvent(QFocusEvent *)
{
m_timer.stop();
setStyleSheet("");
}
__阿飞__ 2012-10-26
  • 打赏
  • 举报
回复
很不错,哈哈,谢谢老师指点了,我感觉实现方法是有很多种,但是我经验不足的可能写出来代码量更大,借鉴下你的方法,我可以省点时间,谢谢!
[Quote=引用 4 楼 的回复:]

QMovie也是定时器,是一样的。

我的建议是,子类化QLabel或QLineEdit。在其派生类里加入一个定时器,定时器激发时设置对象的StyleSheet,(比如border-color属性),然后重载focusInEvent,focusOutEvent函数,实现当焦点进入时启动定时器,离开后关闭定时器。
[/Quote]
xiachm 2012-10-26
  • 打赏
  • 举报
回复
QMovie也是定时器,是一样的。

我的建议是,子类化QLabel或QLineEdit。在其派生类里加入一个定时器,定时器激发时设置对象的StyleSheet,(比如border-color属性),然后重载focusInEvent,focusOutEvent函数,实现当焦点进入时启动定时器,离开后关闭定时器。


__阿飞__ 2012-10-26
  • 打赏
  • 举报
回复
定时器设置个时间,然后到点了,判断下当前的哪个item是focus的,然后设置个控制flag,然后交替的设置item背景颜色?

我想了个解决办法,一个大label上面放一个小label,当focus的时候,大label设置QMovie为一个gif闪烁动画,然后小label负责显示用户输入,这样小label在大label上,用户不会知道我是2个label的,然后foucus移开的话,我就把大label的QMovie拿掉就ok了.
[Quote=引用 1 楼 的回复:]

得用定时器呀
[/Quote]
笨笨马甲 2012-10-26
  • 打赏
  • 举报
回复
TS,使用定时器在事件里面完成背景色改变
xiachm 2012-10-26
  • 打赏
  • 举报
回复
得用定时器呀

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧