- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 Qt
应用程序,其中有多个小部件同时显示按钮。在某些情况下,我希望将按键发送到其中一个小部件,即使该小部件没有焦点。为此,我在主窗口小部件(拥有此应用程序中的所有子窗口小部件)中重写了 keyPressEvent()
,如果它没有焦点,则使用类似的代码将键事件重新发送到子窗口小部件对此:
if (!someWidget->hasFocus())
{
QApplication::sendEvent(someWidget, keyEvent);
}
只要 someWidget
处理上述事件,它就可以很好地工作。如果它忽略它,那么它会进入一个讨厌的无限递归循环,因为事件会向上流动到父级。
有没有办法知道事件的来源,从而防止这种无限循环?我在想这样的事情:
if (!someWidget->hasFocus() && (keyEvent->source != someWidget))
{
QApplication::sendEvent(someWidget, keyEvent);
}
或者是否有其他方法可以防止这种情况发生?
最佳答案
当你使用信号和槽机制时,你可以调用可以给你信息的sender()
,但是你可以做下一步:使用可以给你信息的eventFilter
关于每个将事件发送到 mainWindow
的 QObject
,因此您可以捕获事件和发送者
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::KeyPress)//your keyPressEvent but with eventFilter
if(!someWidget->hasFocus() && obj != someWidget)//your focus and source checkings, obj is object which send some event,
// but eventFilter catch it and you can do something with this info
{
//do something, post event
}
return QObject::eventFilter(obj, event);
}
不要忘记
protected:
bool eventFilter(QObject *obj, QEvent *event);
也许你需要使用QKeyEvent
,所以如果你确定event->type() == QEvent::KeyPress
就转换QEvent
。例如:
QKeyEvent *key = static_cast<QKeyEvent*>(event);
if(key->key() == Qt::Key_0)
{
//do something
}
关于c++ - 确定 QKeyEvent 的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25981262/
我有一个QComboBox,它是可编辑的,我实现了keyPressEvent(QKeyEvent *)方法,但它似乎没有触发这个方法。 我能想到发生这种情况的唯一原因是发生的任何编辑实际上都发生在 l
如何处理Qt按下的非拉丁键? 例如,对于按下的“W”键,QKeyEvent::key() 返回 87,但对于“Ц”(俄语布局中的相同键),它返回 1062。 所以我不能使用像 Qt::Key_W 这样
我正在使用 PyQt5。当我编写一个 keyPressEvent 处理程序时,出于调试目的,我希望能够打印出关于按下了哪些键的人类可读的描述。无论事件中按下了多少键,或者它们是修饰符还是“常规”键,我
http://qt-project.org/doc/qt-5/qwidget.html#keyPressEvent Note that QKeyEvent starts with isAccepted
使用Qt-5.7.0,我想要一个QSpinBox来设置超时值。该值可以以秒或分钟为单位。我会在 SpinBox 后面放一个 QLabel 来说明它是什么。 现在,当用户操作控件时,我希望它根据是否按下
我有一个程序可以捕获单个按键,然后输出被按下的键。问题是,我无法返回按下的键的值,也无法让箭头键输出任何内容。这是我的代码: myApp.h class someClass: public QDial
所以,我有一个应用程序,如果按住特定按钮,它会播放音频设备,当释放按钮时,它会停止音频设备。我使用 keyPressEvent 和 KeyReleaseEvent 来实现这个类似于下面的代码: voi
我有一个 Qt 应用程序,其中有多个小部件同时显示按钮。在某些情况下,我希望将按键发送到其中一个小部件,即使该小部件没有焦点。为此,我在主窗口小部件(拥有此应用程序中的所有子窗口小部件)中重写了 ke
我正处于一种情况,我正在尝试读取一个 JSON 配置文件,该文件规定了哪些关键命令映射到给定的操作。例如: ... { "Action": "Quit", "Combo" : "CTR
我想编写一个响应我的按键事件的复古 snaker,这是我的代码: paint.h #ifndef PAINT_H #define PAINT_H #include #include #include
我需要这样做来配置我的应用程序。 我有重新实现的 keyPressEvent 方法的 QLineEdit 字段。 QKeyEvent *ke = ... QString txt; if(ke->mod
我正在尝试实现一个虚拟键盘小部件。我能想到的最简单的方法是创建 QKeyEvent 实例并使用 QApplication.postEvent() 将它们发送到焦点小部件。 首先,我正在尝试更新我拥有的
上下文:我正在创建一个带有自定义屏幕键盘的小型网络浏览器。 它在 Qt WebKit(QWeb* 类)上几乎可以正常工作,但由于 WebKit 中的错误而导致崩溃...在 Qt 5.4.0 之后不会修
当用户用户按下键盘键时,我想做一些特定的事情。因为我在我的程序中有以下使用 qt 和 C++ 的代码:- //reimplemented keyPressEvent // MyWindow inher
我创建了一个键事件,如果我按下“A”键,它将执行函数 A()。 在 A() 函数中,我将全局参数“g”递增 1 并创建一个 QTimer::singleShot 等待 2 秒并打印“g”的值。例如,“
这个问题在这里已经有了答案: How to make keyword to work instantly with no delay in Qt::4.6 (C++)? (1 个回答) 关闭 6 年
我有: QKeyEvent* event; // I pressed "SHIFT" modifiers = event->nativeModifiers(); // This is 513 valu
我有一个带有项目的 qml 窗口 Keys.onPressed { } 我有一个 C++ 类,它有 protected: void keyPressEvent(QKeyEvent *eve
我是一名优秀的程序员,十分优秀!