Closed keymou closed 7 months ago
这个大概率是 qt 的 bug
把 LineEdit 换成 QLineEdit 看看会不会有此问题
把 LineEdit 换成 QLineEdit 看看会不会有此问题
换成QLineEdit也有问题
ToolTipFilter
对 组件 BreadcrumbBar
不适用,是吗
可能是打开flyout之前是英文输入法导致的,先切换至中文输入法再打开flyout就正常了
工具提示的问题还不确定是怎么回事,可能是弹出位置计算错了
可能是打开flyout之前是英文输入法导致的,先切换至中文输入法再打开flyout就正常了
本地试了下打开Flyout
前就切换到中文输入法还是不行 :frowning:
修改成
class AddNodeFlyoutViewCard(FlyoutViewBase):
closed = Signal()
properties = Signal(dict)
def __init__(self, node_names: Optional[List[str]] = None, path: Optional[List[str]] = None,
serial: Optional[str] = None, parent=None):
"""
:param node_names: 节点名称集合
:param path: 节点路径列表
:param serial: 节点编号
:param parent:
"""
super().__init__(parent)
self.nodeNames = node_names
self.path = path
self.serial = serial
self.viewLayout = QHBoxLayout(self)
self.verticalLayout = QVBoxLayout()
self.titleLabel = QLabel(self)
self.contentView = QFrame(self)
self.gridLayout = QGridLayout(self.contentView)
self.nodeNameLabel = QLabel(self.contentView)
self.nodePathLabel = QLabel(self.contentView)
self.nodeSerialLabel = QLabel(self.contentView)
self.nodeTypeLabel = QLabel(self.contentView)
self.nodeNameLineEdit = LineEdit(self.contentView)
self.nodeSerial = QFrame(self.contentView)
self.nodeSerialLayout = QHBoxLayout(self.nodeSerial)
self.serialLineEdit = LineEdit(self.nodeSerial)
self.editButton = TransparentToolButton(self.nodeSerial)
self.nodeTypeComboBox = ComboBox(self.contentView)
self.nodePathBreadcrumb = BreadcrumbBar(self.contentView)
self.submitButton = PrimaryPushButton(self.contentView)
self.closeButton = TransparentToolButton(FluentIcon.CLOSE, self)
# 初始化界面布局
self._initLayout()
# 初始化组件
self._initWidget()
self.setShadowEffect()
self.setAttribute(Qt.WA_TranslucentBackground)
# self.setWindowFlags(Qt.FramelessWindowHint | Qt.NoDropShadowWindowHint | Qt.Popup)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.NoDropShadowWindowHint)
Demo
中
def showCard(self):
view = AddNodeFlyoutViewCard(['1', '2', '3'], ['abc', 'efd'], '20.1.5')
view.show()
不使用Flyout
,就可以正常输入中文字符。
但其中改为:
self.setWindowFlags(Qt.FramelessWindowHint | Qt.NoDropShadowWindowHint | Qt.Popup)
后,就无法输入中文了 :confused:
本地试了下打开
Flyout
前就切换到中文输入法还是不行 😦
这个确实是Qt的bug,但是Qt官方认为这样做是正确的。Qt官方的bug追踪器显示这个bug自Qt4就有了,原因是Qt官方认为由于输入法本身使用了弹出窗口,所以弹出窗口不应当继续激活输入法以免造成递归,所以设置了Popup的窗口均不会调用processActivatedEvent(),也就不会调用_q_updateFocusObject(),而输入法是在这个函数中启用的。目前看到的解决方法是在showEvent里调用一下activateWindow方法来激活窗口,这样就会调用到_q_updateFocusObject(),但不确定这一做法会不会带来其他的负面影响。
工具提示的问题还不确定是怎么回事,可能是弹出位置计算错了
关于这个部分,如果你使用ToolTipFilter后把BreadcrumbBar的Enabled设置为False(在你的最小示例里是这么做的),那么ToolTip就不会显示出来,因为_canShowToolTip会判断这个条件(见下图)。不过我认为Disabled的控件应该也可以显示tooltip吧,不如把这里改成isVisible,毕竟不可显示的控件没必要显示tooltip 不过即使你设置了Enabled,显示位置好像也不太对,这个应该是位置计算的问题了
本地试了下打开
Flyout
前就切换到中文输入法还是不行 😦这个确实是Qt的bug,但是Qt官方认为这样做是正确的。Qt官方的bug追踪器显示这个bug自Qt4就有了,原因是Qt官方认为由于输入法本身使用了弹出窗口,所以弹出窗口不应当继续激活输入法以免造成递归,所以设置了Popup的窗口均不会调用processActivatedEvent(),也就不会调用_q_updateFocusObject(),而输入法是在这个函数中启用的。目前看到的解决方法是在showEvent里调用一下activateWindow方法来激活窗口,这样就会调用到_q_updateFocusObject(),但不确定这一做法会不会带来其他的负面影响。
工具提示的问题还不确定是怎么回事,可能是弹出位置计算错了
关于这个部分,如果你使用ToolTipFilter后把BreadcrumbBar的Enabled设置为False(在你的最小示例里是这么做的),那么ToolTip就不会显示出来,因为_canShowToolTip会判断这个条件(见下图)。不过我认为Disabled的控件应该也可以显示tooltip吧,不如把这里改成isVisible,毕竟不可显示的控件没必要显示tooltip 不过即使你设置了Enabled,显示位置好像也不太对,这个应该是位置计算的问题了
暂时添加了你说的解决方法,谢谢 :smile:!
def showEvent(self, a0) -> None:
# 激活窗口,解决输入框无法输入中文的 bug
self.activateWindow()
super().showEvent(a0)
下个版本将修复此bug
What happened?
继承 FlyoutViewBase 类自定义组件,其中包含
LineEdit
,BreadcrumbBar
,系统输入法切换到中文,
LineEdit
显示输入为英文字符,无法输入中文,但允许粘贴中文字符。BreadcrumbBar
设置setToolTip
,通过ToolTipFilter
设置位置,无法正常显示,注释掉后可以正常显示。Operation System
Window 7
Python Version
3.8.10 64bit
PyQt/PySide Version
5.15.9
PyQt/PySide-Fluent-Widgets Version
1.5.1
How to Reproduce?
FlyoutViewBase
类自定义组件AddNodeFlyoutViewCard
,组件中包含LineEdit
,无法输入中文字符。若将
AddNodeFlyoutViewCard
基类改为QWidget
,则可以正常输入中文字符。BreadcrumbBar
设置setToolTip
,通过ToolTipFilter
设置位置,无法正常显示,注释掉后可以正常显示。self.nodePathBreadcrumb.installEventFilter(ToolTipFilter(self.nodePathBreadcrumb, 0, ToolTipPosition.TOP))
Minimum code