导航:首页 > 净水问答 > qt过滤父子窗口事件

qt过滤父子窗口事件

发布时间:2021-01-23 01:13:46

⑴ Qt如何捕获键盘事件

您好,Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效。下面关注点在按键特有的部分:
focus

一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。

焦点移动的方式有以下几种:

按下Tab或Shift+Tab

注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等
Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代。
点击一个QWidget
建议:只对接受文本输入的Widget启用该功能
按下键盘的快捷键
QLabel::setBuddy(), QGroupBox,以及 QTabBar 支持
使用鼠标滚轮
用户移动焦点
程序将决定被设置focus的Widget的哪一个子Widget获得焦点

注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget
focusPolicy

一个QWidget获得焦点的方式受 focusPolicy 控制

Qt::TabFocus
通过Tab键获得焦点
Qt::ClickFocus
通过被单击获得焦点
Qt::StrongFocus
可通过上面两种方式获得焦点
Qt::NoFocus
不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点

keypress和keyrelease

首先,我们要是Widget获得焦点,一般设置focusPolicy。

然后要对按键进行响应,我们只需要直接重载:

keyPressEvent
keyReleaseEvent

注意:

对我们不处理的事件,要调用父类的相应事件处理函数。
如果widget当前没有焦点,考虑到事件转发:如果其子widget有焦点,那么该widget未处理的键盘事件将被转发过来。
有时输入焦点不在任何窗口中。这种情况发生在所有程序都是最小化的时候。这时,Windows将继续向活动窗口发送键盘消息,但是这些消息与发送给非最小化的活动窗口的键盘消息有不同的形式。

QKeyEvent

在windows下,与键盘事件有关的有8个消息:

对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息
有些键不产生字符,这些键包括shift键、功能键、光标移动键和特殊字符键如Insert和Delete。对于这些键,Windows只产生按键消息。

这些消息在Qt中只体现在QKeyEvent中。

对字符,可通过 QKeyEvent::text() 获得
其他键,QKeyEvent::key() 获得一个键值

event函数

由于 Tab 键被用来切换焦点,这使得它与众不同。

这是qwidget.cpp的event函数中的代码片段:

case QEvent::KeyPress:
{
QKeyEvent *k = (QKeyEvent *)event;
bool res = false;
if (!(k->modifiers() & (Qt::ControlModifier | Qt::AltModifier)))
{ //### Add MetaModifier?
if (k->key() == Qt::Key_Backtab || (k->key() == Qt::Key_Tab && (k->modifiers() & Qt::ShiftModifier)))
res = focusNextPrevChild(false);
else if (k->key() == Qt::Key_Tab)
res = focusNextPrevChild(true);
if (res)
break;
}
keyPressEvent(k);
}

如果我们需要处理Tab键,需要重载 event 函数。

⑵ qt事件过滤器能不能统一处理所有按钮对象的事件

当一个事件产生时,Qt 通过实例化一个 QEvent 的合适的子类来表示它,然后通过调用 event() 函数发送给 QObject 的实例(或者它的子类)。
event() 函数本身并不会处理事件,根据事件类型,它将调用相应的事件处理函数,并且返回事件被接受还是被忽略。
一些事件,比如 QMouseEvent 和 QKeyEvent,来自窗口系统;有的,比如 QTimerEvent,来自于其他事件源;另外一些则来自应用程序本身。

⑶ qt中窗口对象的父子关系如何指定指定父对象有什么作用及好处

每个对象构建的时来候都自可以在构造函数中进行父对象的指定,同时也可以用setParent的方式进行指定,
指定父对象的好处:
1、父对象在析构的时候,会连带子对象全部释放,如果非子对象则不进行析构,就需要手动进行析构。这样比较麻烦。
2、这样的析构处理只针对指针。

⑷ Qt中能捕获到非当前窗口的鼠标事件吗

添加事件过滤器

⑸ Qt中父子窗口之间焦点传递

获取那个按钮,button->setFocus();就行了!

⑹ Qt中eventFilter事件无法过滤QTextEdit中的mousePreessEvent事件,这是为什么

设置来事件过滤器自时用设置其viewport的事件过滤

实例:

#include<QtGui>
#include<QtDebug>
QTextEdit*pEdit=newQTextEdit(this);
pEdit->viewport()->installEventFilter(this);
boolxxx::eventFilter(QObject*o,QEvent*e)
{
Q_UNUSED(o);
if(e->type()==QEvent::MouseButtonPress){
QMouseEvent*pMe=static_cast<QMouseEvent*>(e);
qDebug()<<pMe->pos();
}
returnfalse;
}

⑺ qt qlineedit怎样使用事件过滤器

自己定义类继承qlineedit, 实现eventFilter函数

⑻ QtCreator创建多窗体后,如何在父子窗体之间传递参数!

网上都有很多例子来说这个问题的, 但是他们举的例子只适合动态创建子窗体的; 一般网上人说的例子都是用QtCreator创建一个主窗体,然后在主窗体中用代码生成的子窗体, 这时候你直接在实例化子窗体时就可以直接把父窗体的指针传递给了子窗体, 这当然是容易的。 当然还是用SIGNAL/SLOT机制了, 但这里需要选择合适的地方来用CONNECT函数来连接信号与槽函数。 这个方法, 我已经测试成功了; 而且效率相当不错的。下面我只是简单地说一下思路吧。 1. 创建子窗体时, 不要像主窗体创建时那样把参数 (QWidget parent = 0),写成这样的话, 你自己找麻烦; 2. 如果你在子窗体里发送信号, 那么你要设置自己的信号函数, 同时在父窗体中设置相应的槽函数。 子窗体: 定义发射的信号 class subclass : public QDialog{Q_OBJECTpublic:private:signals: void emit_your_signals(paramters);};父窗体: 定义接收信号的槽 class parent : public QWidget{Q_OBJECTpublic slots: void accept_your_signals(parameters);};然后在子窗体实体化时进行链接: ui-setupUI(){connect(subwindowpointer, signal, parentwindowpointer, slot);}即可以了以上都是简化写法, 突出信号与槽位置与关系; 剩下的就很简单了, 在你的 子窗体实例化时

⑼ qt事件过滤器中为什么同一个键盘事件连续触发多次

添加个标记int flag = 0。每次接收到事件时判断是否falg == 1,如果是就不做任何处理直接返回,否则将flag设为1并进行处理。在接收到按键弹起消息时再将falg重置为0.

阅读全文

与qt过滤父子窗口事件相关的资料

热点内容
医疗废水国家排放标准 浏览:723
石英砂多介质过滤器厂家电话 浏览:61
lsc500树脂 浏览:182
污水处理电费占运行费用比 浏览:164
曝气生物滤池污水厂 浏览:53
天津工业废水治理企业 浏览:44
用什么洗空调滤芯 浏览:257
老式泰山25拖拉机提升器总成 浏览:965
污水泵空气开关跳闸为什么 浏览:235
sbs树脂可剥漆 浏览:961
温江净水过滤 浏览:13
小区饮水机废水能用吗 浏览:889
过滤网厂家58同城 浏览:112
广州医用超纯水器供水设备多少钱 浏览:952
大金空调室内机提升泵 浏览:172
正规滤芯怎么用 浏览:2
树脂包清洗 浏览:506
超滤膜净水器需要清洗一次 浏览:750
汽油滤芯螺丝滑丝了怎么办 浏览:274
临湘污水处理哪里有卖的 浏览:970