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中对控件做提升处理,无需逐个添加事件过滤器:
- 先实现自定义控件类
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()
- 打开Qt Designer,选中需要修改的QPlainTextEdit控件,右键选择「提升为」
- 提升类名称填写
FixedPlainTextEdit,头文件填写存放该类的Python文件名(无需加.py后缀),点击「添加」→「提升」即可 - 后续重新生成UI代码会自动引用该自定义类,功能不会失效
内容的提问来源于stack exchange,提问作者Ido
相关产品推荐
相关产品推荐

