5

同様の質問を見たことがありますが、必要なものに合う回答はありません。アプリケーション全体の上にある非表示のウィジェットが必要です (ここでは問題ありません)。このウィジェットでイベントをキャッチして、イベントに関する情報を印刷したり、記録したりできるようにしたいと考えています。現在、これをうまく行うイベントフィルターを接続しています。次に、ウィジェットの背後にあるものにイベントを通過させたいと思います。たとえば、ボタンを押そうとすると、非表示のウィジェットはその場所で押されたことを認識し、実際にボタンが押されるはずです。これは簡単な方法で実行できますか?それとも、非表示のウィジェットの下にあるすべてのイベントをシミュレートするコードを作成する必要がありますか?

4

1 に答える 1

4

コメントで開示したすべての情報から、前述のようにイベントをフィルタリングし、QCoreApplication::sendEventを使用して目的のイベントを非表示のウィジェットに転送することをお勧めします。次に、それに応じてイベントを子に伝達します。

編集: OK、これは QObject ベースのイベント フィルターを含む簡単な例です。イベントがマウス イベントの場合、ウィジェットのイベントをフィルター処理します。イベントがキー イベントはフィルタリングされ、ウィジェットには転送されません。

イベント フィルタ クラス:

    class EventInfo : public QObject {
    Q_OBJECT
public:
    explicit EventInfo(QObject *parent = 0) : QObject(parent) {}

    bool eventFilter(QObject *, QEvent *e) {
        if (e->type() == QEvent::MouseButtonRelease){
            qDebug() << "click event not filtered";
            return false;
        }
        if (e->type() == QEvent::KeyRelease) {
            QKeyEvent *event = static_cast<QKeyEvent *>(e);
            if (event) qDebug() << "key" << event->key() << "filtered";
            return true;
        }
        return false;
    }
};

ウィジェット:

class Widget : public QWidget {
    Q_OBJECT

public:
    Widget(QWidget *parent = 0) : QWidget(parent) {}

protected:
    void mouseReleaseEvent(QMouseEvent *e) {
        qDebug() << "widget clicked at position" << e->pos();
    }

    void keyReleaseEvent(QKeyEvent *e) {
        qDebug() << "pressed key" << e->key();
    }
};

main.cpp:

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    Widget w;
    EventInfo info;
    w.installEventFilter(&info);
    w.show();    
    return a.exec();
}

出力をテストして、キーボード イベントがフィルタリングされ、マウス プレス イベントがウィジェットに転送されることを示します。

click event not filtered
widget clicked at position QPoint(352,230) 

key 70 filtered 

click event not filtered
widget clicked at position QPoint(405,163) 

key 87 filtered
于 2013-04-18T13:17:15.253 に答える