5

外部情報: Qt を使用してアプリケーションを構築しようとしています。このアプリケーションは、QMdiArea と子ウィンドウを備えています。私の子ウィンドウには、QMdiArea に統合するか、分離して子自体に添付できるメニューがあります。ただし、これは必要以上に詳細です...

問題: 子ウィジェットに「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 内からデフォルトのキーハンドラーを削除するのと同じくらい単純なことを行うのは、少し複雑すぎるようです。

4

5 に答える 5

2

サブウィンドウを追加するときに追加フラグとしてQMdiSubWindow使用することで、事前定義されたクローズアクションを完全に取り除くことができます。Qt::CustomizeWindowHint

QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(internalWidget2, 
                                                 Qt::Widget | Qt::CustomizeWindowHint | 
                                                 Qt::WindowMinMaxButtonsHint);
于 2012-02-14T12:14:51.897 に答える
0

私が言えることから、私が探しているものは、独自の MDIAarea を作成する以外にはありません。

ショートカットは、QMdiSubWindow の構築中に QMdiSubWindowPrivate::createSystemMenu() で設定されます。Qt ライブラリにパッチを適用せずに削除できるとは思えません。

うまくいけば、誰かがこれを反証するか、QT が変更を加えるでしょう。その間、私たちはこれらの事前に割り当てられたショートカットに近づかないようにする必要があるようです.

于 2011-12-24T19:00:51.297 に答える
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;
 }
于 2011-12-22T05:59:16.110 に答える
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()));
于 2012-03-28T14:10:36.210 に答える