qtextedit和类似的小部件嵌入在qgraphicsscene中的iSscene中的焦点(复制/粘贴),i。e。您需要再次单击QTEXTEDIT才能继续编辑。场景排放到newfocusitem == 0。
的焦点。第一个问题:是错误还是标准行为?
我的调查表明,功能qgraphictemprivate :: setVisibleHelper()在这里清除重点:
if (hasFocus && scene) {
// Hiding the focus item or the closest non-panel ancestor of the focus item
QGraphicsItem *focusItem = scene->focusItem();
bool clear = true;
if (isWidget && !focusItem->isPanel()) {
do {
if (focusItem == q_ptr) {
clear = !static_cast<QGraphicsWidget *>(q_ptr)->focusNextPrevChild(true);
break;
}
} while ((focusItem = focusItem->parentWidget()) && !focusItem->isPanel());
}
if (clear)
clearFocusHelper(/* giveFocusToParent = */ false, hiddenByPanel);
}
qgraphisitem已无证件(内部)flag qgraphictem :: itemSisfoCussCope。如果为qtextedit的代理项目设置了标志,则在菜单之后将重点焦点,但是在任何情况下,焦点首先在该项目再次接收到之后。
第二个问题:什么是?
看起来QGraphicsItem::ItemIsFocusScope
用于pocussCope QML项目。qtquick1是基于qgraphicsscene的,并使用了该标志。
我不确定副作用,但这会有所帮助:
auto edit = new QLineEdit();
auto item = scene->addWidget(edit);
item->setFlag(QGraphicsItem::GraphicsItemFlag::ItemIsPanel);
在QT 5.9上测试,Linux
编辑
对我来说看起来像错误:
- 将
QLineEdit
添加到场景 - 单击焦点
QLineEdit
- 点击上下文键以显示上下文菜单
- 命中ESC钥匙到退出上下文菜单
- 尝试键入
预期: QLineEdit
是集中的,并且出现文本
实际:QLineEdit
输入焦点
请找到它或与QT Bug Tracker报告
因此,可以使用QGraphicsItem::ItemIsFocusScope
标志进行解决方法。
#if (QT_VERSION < QT_VERSION_CHECK(<fixed in Qt version>))
// it's workaround of bug QTBUG-...
# if (QT_VERSION == QT_VERSION_CHECK(<version you are develop with>)
item.setFlag(QGraphicsItem::ItemIsFocusScope);
# else
# error("The workaround is not tested on this version of Qt. Please run tests/bug_..._workaround_test")
# endif