无关信息: 我正在尝试使用Qt构建应用程序。此应用程序具有QMdiArea和子窗口。我的子窗口将有一个菜单,可以集成到QMdiArea或隔离并附加到孩子本身。但是,这比需要的更详细......
问题: 我希望我的child-widget有一个带有快捷键的菜单,“CTRL + W”。但是,因为我使用的是QMdiArea,所以已使用快捷方式导致:
QAction :: eventFilter:不明确的快捷方式重载:Ctrl + W
如何摆脱这个快捷方式并在我的子窗口小部件中声明它?
更新 这是我尝试过没有运气的事情:
class MDI : public QMdiArea
{
Q_OBJECT
private:
bool event(QEvent *tEvent)
{
if (tEvent->type() == QEvent::KeyPress)
{
QKeyEvent* ke = static_cast<QKeyEvent*>(tEvent);
if (ke->key()== Qt::Key_W && ke->modifiers() & Qt::ControlModifier)
emit KeyCW();
return true;
}
return QMdiArea::event(tEvent);
}
public:
signals:
void KeyCW();
};
如果我做一些简单的事情,如将Qt::Key_W
更改为Qt::Key_L.
,则可以使用此功能。收到键组合并抛出事件。有了W,它就永远不会发生。我也尝试将event
移动到QMainWindow以及子窗口中的eventFilter移动到QMdiArea。看起来做一些像QMdiArea中删除默认键处理程序一样简单的事情有点过于复杂。
答案 0 :(得分:2)
在添加子窗口时,您可以使用QMdiSubWindow
作为附加标记来完全摆脱Qt::CustomizeWindowHint
的预定义关闭操作。
QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(internalWidget2,
Qt::Widget | Qt::CustomizeWindowHint |
Qt::WindowMinMaxButtonsHint);
答案 1 :(得分:1)
您可以像这样禁用此快捷方式:
for( QAction *action : subWindow->systemMenu()->actions() ) {
if( action->shortcut() == QKeySequence( QKeySequence::Close ) ) {
action->setShortcut( QKeySequence() );
break;
}
}
答案 2 :(得分:0)
子类QMdiArea并重新实现keyPressEvent()
。这应该有用。
void keyPressEvent(QKeyEvent* event){
if(event->key() == Qt::Key_W and event->modifiers() & Qt::ControlModifier){
// handle it
}else{
return QMdiArea::keyPressEvent(event);
}
}
您还可以使用事件过滤器。关于你的班级等级,我还不够,但我希望你能得到这个想法。
bool CustomMdiArea::eventFilter(QObject *object, QEvent *event){
if(object == yourChildWindow && event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_W and keyEvent->modifiers() & Qt::ControlModifier) {
//handle it
return true;
}else{
return false;
}
}
return false;
}
答案 3 :(得分:0)
据我所知,我正在寻找的东西不可能没有写我自己的MDIArea。
希望在某些时候有人会反驳这一点,否则QT会做出改变。同时,看起来我们都需要远离这些预先指定的捷径。
答案 4 :(得分:0)
通过为我的关闭操作设置快捷方式上下文,我能够解决这个问题。通过将其设置为Qt::WidgetShortcut
,我不再获得模糊的快捷方式重载。以下是我现在正在设置我的近距离行动的方式:
closeAction = new QAction(tr("&Close"), this);
closeAction->setShortcut(Qt::CTRL|Qt::Key_W);
closeAction->setShortcutContext(Qt::WidgetShortcut);
connect(closeAction, SIGNAL(triggered()), mdiArea, SLOT(closeActiveSubWindow()));