gpt4 book ai didi

c++ - QGraphicsScene、QTextEdit 和失去焦点

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:20 24 4
gpt4 key购买 nike

QTextEdit 和 QGraphicsScene 中嵌入的类似小部件在使用标准上下文菜单(复制/粘贴)后失去焦点,即。 e.您需要再次单击 QTextEdit 才能继续编辑。场景使用 newFocusItem==0 发出 focusItemChanged。

第一个问题:是错误还是标准行为?

我的调查显示函数 QGraphicsItemPrivate::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 具有未记录的(内部)标志 QGraphicsItem::ItemIsFocusScope。如果为 QTextEdit 的代理项设置了标志,它会在菜单后返回焦点,但在任何情况下,焦点首先被清除,然后该项目再次接收它。

第二个问题:标志 QGraphicsItem::ItemIsFocusScope 的作用是什么?

最佳答案

看起来 QGraphicsItem::ItemIsFocusScope 是针对 FocusScope 的QML 项。 QtQuick1 基于 QGraphicsScene 并使用了该标志。

我不确定副作用,但这有帮助:

auto edit = new QLineEdit();
auto item = scene->addWidget(edit);
item->setFlag(QGraphicsItem::GraphicsItemFlag::ItemIsPanel);

在 Qt 5.9、Linux 上测试


编辑

对我来说看起来像错误:

  • 添加QLineEdit到场景
  • 点击聚焦QLineEdit
  • 点击 ContextMenu 键显示上下文菜单
  • 按 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

关于c++ - QGraphicsScene、QTextEdit 和失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46081929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com