1

QQuickWindowドラッグで移動できるフレームレスウィンドウを継承して作成しました。ウィンドウ内にSlider要素を配置しました。問題はSlider、イベントが親ウィンドウに転送され、スライダーの値を変更しようとするとウィンドウが移動することです。動作は次のとおりです。

ここに画像の説明を入力

スライダーがマウスイベントを受け入れ、ウィンドウに転送しないようにする可能性はありますか?

これが私のコードです:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QUrl>

#include "mywindow.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<MyWindow>("mycustomlib", 1, 0, "MyWindow");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

main.qml

import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import mycustomlib 1.0

MyWindow {
    width: 300
    height: 180
    visible: true
    x: 250
    y: 250
    color: "beige"

    Slider {
        anchors.fill: parent
        value: 0.5
    }
}

mywindow.h

#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <QQuickWindow>

class MyWindow : public QQuickWindow
{
    Q_OBJECT

public:
    MyWindow(QWindow *pParent = Q_NULLPTR);

protected:
    virtual void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
    virtual void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;
    virtual void mouseReleaseEvent(QMouseEvent* e) Q_DECL_OVERRIDE;

private:
    bool m_move;
    QPoint m_initialMouseClickPos;
};

#endif // MYWINDOW_H

mywindow.cpp

#include "mywindow.h"

#include <QDebug>
#include <QCursor>

MyWindow::MyWindow(QWindow *pParent) :
    QQuickWindow(pParent),
    m_move(false)
{
    setFlags(Qt::FramelessWindowHint);
}

void MyWindow::mouseMoveEvent(QMouseEvent *e)
{
    if (m_move) {
        const QPoint newMousePosition = e->pos() - m_initialMouseClickPos + position();
        setPosition(newMousePosition);
    }

    QQuickWindow::mouseMoveEvent(e);
}

void MyWindow::mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton)
    {
        m_initialMouseClickPos = e->pos();
        m_move = true;
    }

    QQuickWindow::mousePressEvent(e);
}

void MyWindow::mouseReleaseEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton)
    {
        m_move = false;
    }

    QQuickWindow::mouseReleaseEvent(e);
}
4

2 に答える 2

1

問題はQQuickWindow::mouseXxxEvent()、イベントが属するアイテムにイベントを配信することです。イベント ハンドラをオーバーライドし、最初に処理を行ってから、イベントを に渡しQQuickWindowます。したがって、Slider は、カスタム イベント処理を行った直後にイベントを受け取ります。イベントをアイテムに配信したくない場合は基本クラスの実装を呼び出さないか、最初に基本クラスの実装を呼び出して、イベントが受け入れられなかった場合などにのみカスタム処理を後で行います。

void MyWindow::mousePressEvent(QMouseEvent *e)
{
    QQuickWindow::mousePressEvent(e);

    if (!e->isAccepted() && e->button() == Qt::LeftButton)
    {
        m_initialMouseClickPos = e->pos();
        m_move = true;
    }

}
于 2016-09-13T20:19:48.497 に答える