从小部件的父级访问坐标

Posted

技术标签:

【中文标题】从小部件的父级访问坐标【英文标题】:Access coordinates from the parent of a widget 【发布时间】:2016-08-23 06:25:16 【问题描述】:

我在MainWindow 中有一个QGraphicsView,它实现了QGraphicScene。当我在QGraphicScene 的某个部分上单击鼠标右键时,我需要弹出一个小部件。小部件的父级必须是MainWindow

我的问题是我需要验证我在QGraphicScene 中的mousePressEvent 内单击的女巫部分的有效性,并在完全相同的位置弹出小部件但QGraphicScene 和@ 的坐标987654329@显然不一样。为此,我使用自定义信号触发MainWindow 内的插槽,并从MainWindowmousePressEvent 获取坐标。问题是来自QGraphicsScenemouseEvent 在来自MainWindowmouseEvent 之前被触发。如果我右键单击两次,这非常有意义并且有效,但我需要它从第一次右键单击开始工作。

我无法实现过滤器或更改焦点,因为应用程序中有大量事件。

QGraphicScene:

void CGraphicScene :: mousePressEvent(QGraphicsSceneMouseEvent *event)

    if(event -> button() == Qt::RightButton)
    
        //test stuff

        emit signalChangeContextualMenuPosition();
        m_contextualMenu -> show();
    

主窗口:

    CGraphicScene *scene;
    CContextualMenu *m_contextualMenu;
    m_contextualMenu = new CContextualMenu(this);
    m_contextualMenu ->close();
    scene = new CGraphicScene(m_contextualMenu);

    ui->gvInterface -> setScene(scene);
    connect(scene, SIGNAL(signalChangeContextualMenuPosition()), this, SLOT(openPopUp()));

    void MainWindow :: openPopUp()
    
         m_contextualMenu ->move(m_xCoordPopMenu, m_yCoordPopMenu);
    

    void MainWindow :: mousePressEvent(QMouseEvent *event)
    
        if(event -> button() == Qt::RightButton)
        
            m_xCoordPopMenu = event -> x();
            m_yCoordPopMenu = event -> y();
        
    

【问题讨论】:

【参考方案1】:

使用QGraphicsView::mapFromScene() 将场景坐标映射到视图小部件坐标,然后使用QWidget::mapToParent() 将坐标映射到它的父小部件,这可能是您的主窗口。您还可以找到有用的方法QWidget::mapTo()

【讨论】:

这是一个非常好的解决方案。我设法将我希望用信号弹出小部件的点发送到主窗口。在那一点上,我在 QGraphicsView 上使用了 mapFromScene。

以上是关于从小部件的父级访问坐标的主要内容,如果未能解决你的问题,请参考以下文章

Qt 设计师;难以将小部件放置在正确的父级中

透明小部件不随其父级移动

RUST + FLTK:从小部件 on_push() 函数访问另一个小部件

Android - 如何从小部件访问房间数据库

试图从小部件访问状态,可能使用了错误的设计

QT如何摆脱小部件与其父母之间的空间