在mousePressEvent()中更改QWidget父项不起作用

时间:2016-04-22 08:12:43

标签: c++ qt

我正在更改我单击的public String getDatatipFormat() { return "<span style=\"display:none;\">%s</span><span>%s</span>"; } 的父窗口小部件,以便在父窗口区域周围拖动该窗口小部件。我需要在QWidget回调中更改父级,因为前一个父级的帧非常有限。

这会产生意外丢失鼠标事件的意外结果,并且在我开始回复mousePressEvent()之前不得不再次点击。

如果发生这种情况,我所拥有的只有以下几点。

mouseMoveEvent()

如果我删除cardWidget->setParent(feltWidget); cardWidget->show(); 电话,则按预期工作。怎么做才能让我仍然可以更改父节点,但它看起来不像当前对象我的鼠标光标被破坏而且创建了一个新的。

1 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,涉及在mouseEvents期间更改QDockWidget的父级。以下是我从调试Qt和我提出的解决方案中学到的东西,最后我没有采取任何措施:不要这样做,它会导致其他不需要的Qt行为。

我所做的是在&#34;重新育儿&#34;之前发送MouseMove事件。然后,触发&#34;拖动&#34;机制再次(因为重新父母停止它)。这是特定于QDockWidgets,我不确定这是否适用于您的情况。但是,这是相关的代码:

    // end the drag before re-parenting
    QMouseEvent endDrag(QEvent::NonClientAreaMouseMove, QCursor::pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
    const bool handledEndDrag = QApplication::sendEvent(&dockWidget, &endDrag);
    assert(handledEndDrag);

    // set this attribute to avoid a hide()-event spoiling the drag-and-drop
    dockWidget.setAttribute(Qt::WA_WState_Hidden, true);

    // ... do re-parenting

    dockWidget.setAttribute(Qt::WA_WState_Hidden, false);

    // trigger start drag again
    QMouseEvent* startDrag =
        new QMouseEvent(QEvent::NonClientAreaMouseButtonPress, dockWidget.mapFromGlobal(QCursor::pos()),
                        Qt::LeftButton, Qt::LeftButton, QApplication::keyboardModifiers());
    QApplication::postEvent(&dockWidget, startDrag);

    // fake this mouse move event to continue dragging
    QMouseEvent mouseMove(QEvent::MouseMove, current->pos(), current->pos(), Qt::NoButton,
                QApplication::mouseButtons(), QApplication::keyboardModifiers());
    const bool handledMouseMove = QApplication::sendEvent(m_dock, &mouseMove);
    assert(handledMouseMove);

您必须调试一些Qt代码才能完全理解特定情况下的情况。并且好像这还不够:不同的Qt版本也可能表现不同。

正如你所知道的那样,我有很多有趣的&#34;这样做。祝你好运,QForce可能和你在一起。