我正在更改我单击的public String getDatatipFormat()
{
return "<span style=\"display:none;\">%s</span><span>%s</span>";
}
的父窗口小部件,以便在父窗口区域周围拖动该窗口小部件。我需要在QWidget
回调中更改父级,因为前一个父级的帧非常有限。
这会产生意外丢失鼠标事件的意外结果,并且在我开始回复mousePressEvent()
之前不得不再次点击。
如果发生这种情况,我所拥有的只有以下几点。
mouseMoveEvent()
如果我删除cardWidget->setParent(feltWidget);
cardWidget->show();
电话,则按预期工作。怎么做才能让我仍然可以更改父节点,但它看起来不像当前对象我的鼠标光标被破坏而且创建了一个新的。
答案 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可能和你在一起。