Pyside PlainText 占位符文本未显示
Pyside PlainText placeholder text not showing
我为我的项目创建了一个图形用户界面,我需要为 QPlainText 使用占位符文本。(我使用 qt 设计器创建图形用户界面并生成抛出 pyside 的代码)它有点乏味,但这就是我现在的方式.我对占位符有疑问 - 它不会显示在纯文本上,除非我先写然后删除。我需要它一直显示,除非占位符被点击或标记到。我在网上找到了一些解决方案,但 none 似乎适用于 me.most 我看到的使用焦点功能的答案,但我不太明白这个想法,即使我尝试了,它们也没有在我的整个 gui 上工作将焦点设置为清除或其他对象。此外,我需要从 qt 设计器本身解决这个问题,或者抛出主要的 class im 使用 - 因为我每次都更改 gui 并生成一个新的 gui,因此对 gui 中的代码的更改不会进一步应用。
我添加了下面的代码作为我在我的项目中使用的纯文本 im 的最小示例。而且我知道如果我生成的代码在最近更改占位符后抛出 pyqt5,它将按我想要的方式工作,但不幸的是我需要它在尚未更新的 pyside 中。
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(480, 640)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.shifted_text_encode = QPlainTextEdit(self.centralwidget)
self.shifted_text_encode.setObjectName(u"shifted_text_encode")
self.shifted_text_encode.setGeometry(QRect(80, 170, 311, 131))
self.shifted_text_encode.setFocusPolicy(Qt.StrongFocus)
self.shifted_text_encode.setTabChangesFocus(True)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.shifted_text_encode.setPlainText("")
self.shifted_text_encode.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Enter text", None))
# retranslateUi
看来是Qt的bug,我也在Qt5和Qt6中复现了
解释:
在私有Qt中API有一个函数可以重新计算placeHolderText是否可见,当文本改变时调用它,但在设置placeHolder时不重新计算导致意外行为。
解决方法
一个可能的解决方案是删除 self.shifted_text_encode.setPlainText("")
或在 self.shifted_text_encode.setPlaceholderText(...)
之后使用 self.shifted_text_encode.clear()
。
我刚刚报告了错误 QTBUG-96212
我为我的项目创建了一个图形用户界面,我需要为 QPlainText 使用占位符文本。(我使用 qt 设计器创建图形用户界面并生成抛出 pyside 的代码)它有点乏味,但这就是我现在的方式.我对占位符有疑问 - 它不会显示在纯文本上,除非我先写然后删除。我需要它一直显示,除非占位符被点击或标记到。我在网上找到了一些解决方案,但 none 似乎适用于 me.most 我看到的使用焦点功能的答案,但我不太明白这个想法,即使我尝试了,它们也没有在我的整个 gui 上工作将焦点设置为清除或其他对象。此外,我需要从 qt 设计器本身解决这个问题,或者抛出主要的 class im 使用 - 因为我每次都更改 gui 并生成一个新的 gui,因此对 gui 中的代码的更改不会进一步应用。
我添加了下面的代码作为我在我的项目中使用的纯文本 im 的最小示例。而且我知道如果我生成的代码在最近更改占位符后抛出 pyqt5,它将按我想要的方式工作,但不幸的是我需要它在尚未更新的 pyside 中。
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(480, 640)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.shifted_text_encode = QPlainTextEdit(self.centralwidget)
self.shifted_text_encode.setObjectName(u"shifted_text_encode")
self.shifted_text_encode.setGeometry(QRect(80, 170, 311, 131))
self.shifted_text_encode.setFocusPolicy(Qt.StrongFocus)
self.shifted_text_encode.setTabChangesFocus(True)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.shifted_text_encode.setPlainText("")
self.shifted_text_encode.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Enter text", None))
# retranslateUi
看来是Qt的bug,我也在Qt5和Qt6中复现了
解释:
在私有Qt中API有一个函数可以重新计算placeHolderText是否可见,当文本改变时调用它,但在设置placeHolder时不重新计算导致意外行为。
解决方法
一个可能的解决方案是删除 self.shifted_text_encode.setPlainText("")
或在 self.shifted_text_encode.setPlaceholderText(...)
之后使用 self.shifted_text_encode.clear()
。
我刚刚报告了错误 QTBUG-96212