gpt4 book ai didi

c++ - 使 QML 项/控件接受事件,从而不将它们转发给父级

转载 作者:行者123 更新时间:2023-11-30 03:38:37 25 4
gpt4 key购买 nike

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

enter image description here

是否有可能使 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();
}

ma​​in.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);
}

最佳答案

问题是 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;
}

}

关于c++ - 使 QML 项/控件接受事件,从而不将它们转发给父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com