從您的標籤,我猜你使用Python包裝到Qt。我的例子有C++代碼,但仍然適用於Python版本的Qt,如果這是你使用的。
它看起來像QObject :: eventFilter可能會做你正在尋找。您需要創建一個帶有eventFilter(QObject * sender,QEvent * event)的類作爲成員。對於你想跟蹤的每個QLineEdit,執行一些操作,比如'myLineEdit-> setEventFilter(eventFilterClassInstance);'
這使您可以攔截您安裝了事件過濾器的每個對象的所有QEvent。您可以在多個對象上安裝事件過濾器,然後通過設置它們的QObject開始過濾。最重要的是,如果您希望將事件作爲正常處理,則可以從eventFilter返回true;如果不應該看到該事件,則可以返回false。
既然你有興趣做撤銷/重做,你可以做isUndoAvailable()來檢查它是否是。
代碼可能是這樣的:
MyEventFilterClass::eventFilter(QObject *object, QEvent *event)
{
if (object == someLineEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
int key = keyEvent->key();
int mods = keyEvent->modifiers();
if (mods == Qt::ShiftModifier && key == Qt::Key_Z) {
if (someLineEdit->undoAvailable()) {
someLineEdit->undo();
return true;
}
else {
/* There are a few options here: */
/* If you have a list of known parents, you could iter over them, and pick the right one. */
/* Or maybe you want the event filter to emit a signal for the parents to see. */
return true;
}
}
}
}
}
對於第二部分,你可以使用的QApplication :: focusWidget,看看當前具有焦點(我沒有測試這個雖然)。我有一個主窗口,它查看兩個可能的窗口來確定哪個窗口具有焦點,並將撤消操作應用於具有焦點的窗口。
我意識到你的問題很古老,但我希望這有助於。
謝謝!我可以通過事件過濾器來捕捉按鍵,但我仍然無法讓它們冒泡到主應用程序。我可以傳遞一個引用並明確地調用它,但我仍然想知道是否有更好的方法:) –