You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide2中Qt Designer生成的QPlainTextEdit占位符默认不显示问题求解

PySide2 QPlainTextEdit 占位符显示异常修复方案

该方案无需修改Qt Designer自动生成的UI代码,重新生成GUI代码也不会失效,满足使用需求。

实现逻辑

旧版本PySide2的QPlainTextEdit存在占位符渲染bug:初始状态下即使文本为空、控件未获得焦点,也不会主动绘制占位符,仅在文本内容变更后才会触发占位符的重绘逻辑。只需监听控件的焦点变化事件,主动触发重绘即可修复该问题。

最小修改实现(直接在主类中添加逻辑)

在自定义的主窗口类中添加事件过滤器即可,完整运行代码如下:

import sys
from PySide2.QtCore import QEvent
from PySide2.QtWidgets import QMainWindow, QApplication
# 导入自动生成的Ui_MainWindow类
from your_ui_file import Ui_MainWindow

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # 给目标文本框安装事件过滤器
        self.shifted_text_encode.installEventFilter(self)
        # 初始触发一次重绘,保证启动时占位符正常显示
        self.shifted_text_encode.update()

    def eventFilter(self, watched, event):
        if watched == self.shifted_text_encode:
            # 监听焦点进出事件,触发重绘更新占位符状态
            if event.type() in (QEvent.FocusIn, QEvent.FocusOut):
                watched.update()
        return super().eventFilter(watched, event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

多控件适配方案(Qt Designer控件提升)

如果有多个QPlainTextEdit需要适配该功能,可以自定义控件子类,再在Qt Designer中对控件做提升处理,无需逐个添加事件过滤器:

  1. 先实现自定义控件类
from PySide2.QtWidgets import QPlainTextEdit

class FixedPlainTextEdit(QPlainTextEdit):
    def focusInEvent(self, event):
        super().focusInEvent(event)
        self.update()

    def focusOutEvent(self, event):
        super().focusOutEvent(event)
        self.update()
  1. 打开Qt Designer,选中需要修改的QPlainTextEdit控件,右键选择「提升为」
  2. 提升类名称填写FixedPlainTextEdit,头文件填写存放该类的Python文件名(无需加.py后缀),点击「添加」→「提升」即可
  3. 后续重新生成UI代码会自动引用该自定义类,功能不会失效

内容的提问来源于stack exchange,提问作者Ido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:15:01