Qt无法检测到光标键Qt::Key_up,Qt::Key_Down的问题

加盾男爵 2017-10-16 04:08:32
我做了个测试的程序,一个对话框上方了两个QPushButton,然后在QDialog的按键事件里有

void test::ketPressEvent(QKeyEvent* event)
{
if(event->key() == Qt::Key_Up)
qDebug()<<"Up";
else if(event->key() == Qt::Key_Up)
qDebug()<<"Down";
else if(event->key() == Qt::Key_F1)
qDebug()<<"F1";
//.
//.
//.
QDialog::keyPressEvent(event);
}


运行程序后,点击其他键都能显示,比如点击F1键,就会输出F1,但点击光标键上下左右都没有任何反应?这是什么情况,为什么程序检测不到光标键?

程序运行时我试了一下,光标上下,或者左右,程序的焦点会在对话框上的两个QPushButton上来回移动,所以程序肯定能响应光标键

我试win7+vs2013+Qt5.7
...全文
1390 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
加盾男爵 2017-10-23
  • 打赏
  • 举报
回复
引用 10 楼 u010370871 的回复:
[quote=引用 9 楼 qazaq408 的回复:] [quote=引用 8 楼 u010370871 的回复:] 估计是焦点问题?
一般qt事件都是先发给父窗体,然后在由父窗体传递给子窗体,但光标事件貌似是特殊处理的,直接由系统给子窗体,不经过父窗体,所以没办法在父窗体上检测到[/quote] 你这个貌似纯粹是自以为=。=[/quote] 不是我自以为是,网上插到的零零碎碎就是怎么说的,但我不太确定查到的资料的正确性,所以我说貌似
张小飞Official 2017-10-23
  • 打赏
  • 举报
回复
引用 9 楼 qazaq408 的回复:
[quote=引用 8 楼 u010370871 的回复:] 估计是焦点问题?
一般qt事件都是先发给父窗体,然后在由父窗体传递给子窗体,但光标事件貌似是特殊处理的,直接由系统给子窗体,不经过父窗体,所以没办法在父窗体上检测到[/quote] 你这个貌似纯粹是自以为=。=
加盾男爵 2017-10-23
  • 打赏
  • 举报
回复
引用 8 楼 u010370871 的回复:
估计是焦点问题?
一般qt事件都是先发给父窗体,然后在由父窗体传递给子窗体,但光标事件貌似是特殊处理的,直接由系统给子窗体,不经过父窗体,所以没办法在父窗体上检测到
张小飞Official 2017-10-23
  • 打赏
  • 举报
回复
估计是焦点问题?
加盾男爵 2017-10-23
  • 打赏
  • 举报
回复
又试了下,对于一个主窗体,如果设置他所有的子窗体均为
childWidget->setFocusPolicy(Qt::NoFocus);
然后就可以在主窗体的按键事件中检测到光标键Qt::Key_Up,Qt::Key_Down了,但现在问题是我的程序里各式各样的子窗体很对,一大部分都不是我写的(公司其他部门人写的),现在有些子窗体需要响应光标,所以没办法全部设置为setFocusPolicy(Qt::NoFocus);
张小飞Official 2017-10-23
  • 打赏
  • 举报
回复
引用 11 楼 qazaq408 的回复:
[quote=引用 10 楼 u010370871 的回复:] [quote=引用 9 楼 qazaq408 的回复:] [quote=引用 8 楼 u010370871 的回复:] 估计是焦点问题?
一般qt事件都是先发给父窗体,然后在由父窗体传递给子窗体,但光标事件貌似是特殊处理的,直接由系统给子窗体,不经过父窗体,所以没办法在父窗体上检测到[/quote] 你这个貌似纯粹是自以为=。=[/quote] 不是我自以为是,网上插到的零零碎碎就是怎么说的,但我不太确定查到的资料的正确性,所以我说貌似[/quote] 是不是对的你写个简单的demo试试不就知道了。你回帖这个功夫早就写好了
加盾男爵 2017-10-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/digu/article/details/1801004 这是我网上找到的唯一资料,其他的都是这篇的复制(这个也不是原文) 我试了下直接重写bool event(QEvent* event)函数,但还是检测不到光标键,tab键也同样检测不到

bool test::event(QEvent* e)
{
	if (e->type() == QEvent::KeyPress)
	{
		QKeyEvent* kEvent = static_cast<QKeyEvent*>(e);
		if (kEvent->key() == Qt::Key_Up)  //这里枚举换成Qt::Key_Tab或者其他3个光标键,同样检测不到
		{
			qDebug() << "up";  //没有输出
		}
	}
	return QDialog::event(e);
}
加盾男爵 2017-10-18
  • 打赏
  • 举报
回复
引用 4 楼 qq937772489 的回复:
必须setFocus一个不能响应Up,Down的控件才能监测到你按Key_Up,Key_Down的事件。程序的焦点会在对话框上的两个QPushButton上来回移动,就是你的这个事件被响应了一次,不能在被响应第二次,所以没有qDebug。解决方法就是去掉这些要响应按键Key_Up,Key_Down的按钮和其他控件,或者setfoucs一个不会响应KeyUp,KeyDown的控件。
实际情况是这样的,一个主窗体(对话框),包含了大量的子窗体,有QT的,有自定义的,其中很多子窗体依赖焦点获得,所以没办法把所有的子窗体都设为
widgets->->setFocusPolicy(Qt::NoFocus);
然后其中有一组按钮,需要用光标键进行来回切换,应为机器是公司自己设计的,由于硬件方面的原因,这个功能只能切必须用光标键,所以需要在主窗体上实现这样的功能

if(event->key() == Qt::Key_Up)
    doSomething();
else if(event->key() == Qt::Key_Down)
    doAnotherThings();
  • 打赏
  • 举报
回复
必须setFocus一个不能响应Up,Down的控件才能监测到你按Key_Up,Key_Down的事件。程序的焦点会在对话框上的两个QPushButton上来回移动,就是你的这个事件被响应了一次,不能在被响应第二次,所以没有qDebug。解决方法就是去掉这些要响应按键Key_Up,Key_Down的按钮和其他控件,或者setfoucs一个不会响应KeyUp,KeyDown的控件。
qq_36862989 2017-10-18
  • 打赏
  • 举报
回复
第一行ket???
加盾男爵 2017-10-17
  • 打赏
  • 举报
回复
引用 1 楼 zc1239044730 的回复:
可能被上层过滤器给过滤了, 你重载下eventFilter()这个看看
这个QDialog就是最顶层窗体了。。。。按键事件就是这个QDialog的按键事件
9990002222 2017-10-17
  • 打赏
  • 举报
回复
可能被上层过滤器给过滤了, 你重载下eventFilter()这个看看

16,203

社区成员

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

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