QGraphicsScene,QTEXTEDIT和失去的焦点



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

相关内容

  • 没有找到相关文章

最新更新