如何更改(短)QLineEdit 中文本的可见部分?

Posted

技术标签:

【中文标题】如何更改(短)QLineEdit 中文本的可见部分?【英文标题】:How do I change visible part of the text in a (short) QLineEdit? 【发布时间】:2018-04-24 14:34:50 【问题描述】:

在我的 PyQt GUI 中,我有几个相对较短(只读)的 QLineEdit,其中包含一些文本。由于包含的文本比小部件本身长,因此只能显示其中的一部分。 QLineEdit 小部件通常显示最后一部分(默认情况下):

如图所示,我想让文本的第一部分可见(默认情况下)。我该怎么做?

我在下面添加了一些代码来帮助您快速设置测试用例。只需将代码复制粘贴到*.py 文件中,运行它,您应该会在一个窗口中获得一个QLineEdit。

import sys
import os
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


'''================================================================================'''
'''|                           CUSTOM MAIN WINDOW                                 |'''
'''================================================================================'''
class CustomMainWindow(QMainWindow):

    def __init__(self):
        super(CustomMainWindow, self).__init__()

        # -------------------------------- #
        #           Window setup           #
        # -------------------------------- #

        # 1. Define the geometry of the main window
        # ------------------------------------------
        self.setGeometry(100, 100, 800, 200)
        self.setWindowTitle("QLineEdit test")

        # 2. Create frame and layout
        # ---------------------------
        self.__frm = QFrame(self)
        self.__frm.setStyleSheet("QWidget  background-color: #ffffff ")
        self.__lyt = QVBoxLayout()
        self.__lyt.setAlignment(Qt.AlignTop)
        self.__frm.setLayout(self.__lyt)
        self.setCentralWidget(self.__frm)

        # 3. Create QLineEdit
        # -------------------
        self.__myQLineEdit = QLineEdit("This is a very long line")
        self.__myQLineEdit.setFixedWidth(100)
        self.__myQLineEdit.setReadOnly(True)
        self.__lyt.addWidget(self.__myQLineEdit)


        self.show()

'''=== end Class ==='''


if __name__ == '__main__':
    app = QApplication(sys.argv)
    QApplication.setStyle(QStyleFactory.create('Fusion'))
    myGUI = CustomMainWindow()
    sys.exit(app.exec_())

''''''

最后但并非最不重要的一点是,为了完整起见,我想描述一下我的系统:

Windows 10,64 位 Python 3.6 PyQt5

【问题讨论】:

【参考方案1】:

您可以在各种事件上设置光标位置,例如当行编辑小部件失去焦点时:

class CustomLineEdit(QLineEdit):
    def __init__(self, txt, parent=None):
        super(CustomLineEdit, self).__init__(txt, parent)
        self.setCursorPosition(0)

    def focusOutEvent(self, e):
        self.setCursorPosition(0)

可能还有其他事件,例如选择何时更改,如果您愿意的话。

【讨论】:

太好了,这行得通! “其他事件,例如选择更改时”是什么意思?那会有什么表现? 可以通过选择文本并将选择扩展到文本的不可见部分来滚动。如果您想防止这种情况发生,请将selectionChanged() 信号连接到执行相同操作的插槽 (self.setCursorPosition(0))。 @fferri 在我的例子中自定义QLineEdit 仍然有隐藏的文本左侧部分,但根据focusOutEvent 它在焦点消失时发生了变化。左侧部分变得可见。但是,我生成了多个QLineEdit,当焦点不在时,光标仍然保持在一行中。在我的情况下,解决方案是首先将文本设置为小部件,然后将 setCursorPosition(0).

以上是关于如何更改(短)QLineEdit 中文本的可见部分?的主要内容,如果未能解决你的问题,请参考以下文章

Python PyQt5:如果 QLineEdit 为空,如何更改 QLabel 的颜色?

使用PyQt中的QCheckBox或QComboBox更改小部件可见性

QLineEdit 单击时清除文本并从按钮读取文本[关闭]

在qlineedit获得文本后如何删除空格?

QStyledItemDelegate 部分选择默认 QLineEdit 编辑器的文本

Qt5,在qlineEdit中设置文本大小