1

我继承QQuickWindow并创建了一个可以通过拖动移动的无框窗口。在我的窗口里面我放了一个Slider元素。问题是Slider将事件转发到父窗口,当我尝试更改滑块上的值时,窗口会随之移动。以下是它的行为方式:

在此处输入图像描述

是否有可能使滑块接受鼠标事件而不是将它们转发到窗口?

这是我的代码:

主文件

#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
    }
}

我的窗口.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

我的窗口.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

滑块不是小部件,它不会像小部件那样处理事件:(

要在 a 上实现拖动QQuickWindow,您可以在 Qt Quick 中的控件后面有一个鼠标区域,并让它向前拖动到一个辅助对象,然后拖动窗口。

于 2016-09-13T13:29:44.420 回答
1

问题在于QQuickWindow::mouseXxxEvent()将事件传递给它所属的项目。您已经覆盖了事件处理程序,首先进行处理,然后将事件传递给QQuickWindow. 因此,滑块在您完成自定义事件处理后立即接收事件。当您不希望将事件传递给项目时,不要调用基类实现,或者先调用基类实现,然后仅在事件未被接受时才进行自定义处理。

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 回答