PyQt5:文本框在 windows 11 中不工作

PyQt5: Textbox's Not working in windows 11

我最近切换到 windows11 并决定开始一个 QyQt5 项目,我开始添加按钮,效果很好。但是当我尝试在文本框中输入时,它不会显示文本也不会输入任何内容。它唯一显示的是我突出显示了文本框。可悲的是,没有错误或日志显示它为什么会这样。 这是发生了什么:

这是我使用的代码:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(332, 121)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.Download = QtWidgets.QPushButton(self.centralwidget)
        self.Download.setGeometry(QtCore.QRect(240, 70, 75, 23))
        self.Download.setObjectName("Download")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 70, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.linkbox = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.linkbox.setGeometry(QtCore.QRect(23, 30, 291, 21))
        self.linkbox.setToolTipDuration(-5)
        self.linkbox.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.linkbox.setInputMethodHints(QtCore.Qt.ImhMultiLine|QtCore.Qt.ImhNoEditMenu)
        self.linkbox.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.linkbox.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.linkbox.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.linkbox.setTabChangesFocus(True)
        self.linkbox.setPlainText("")
        self.linkbox.setObjectName("linkbox")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "ChaosCapture"))
        self.Download.setText(_translate("MainWindow", "Download"))
        self.pushButton.setText(_translate("MainWindow", "Options"))
        self.linkbox.setPlaceholderText(_translate("MainWindow", "Enter the download link here"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

您为 QPlainTextEdit 使用了非常小的高度,并且它完全被水平滚动条覆盖(您已将其设置为始终打开)。

您也没有使用layout managers,这是非常令人沮丧的。例如,用户可以调整 window 的大小并使其变小,这样小部件就可以部分可见或完全隐藏。布局管理器应始终优先于预定的几何形状。

应该做三件事:

  1. 设置一个 layout in Designer,在你的情况下网格布局会很好:右键单击 window 的空白区域,打开“布局”菜单和 select “布置在网格中”;
  2. 为纯文本编辑设置任意最小高度(以便您可以在设计器中调整window);
  3. 程序脚本中,根据字体指标;
  4. 设置小部件的最小高度

请注意,程序脚本 必须 是一个单独的文件,而不是您向我们展示的文件(pyuic 文件),出于任何原因必须 永远不会 进行手动编辑(阅读有关 using Designer 的更多信息)。

以下代码假定pyuic文件名为ui_mainwindow.py.

from PyQt5 import QtWidgets
from ui_mainwindow import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.linkbox.setMinimumHeight(
            self.fontMetrics().height() + 
            self.linkbox.frameWidth() * 2 +
            self.linkbox.document().documentMargin() * 2 + 
            self.linkbox.horizontalScrollBar().sizeHint().height()
        )

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

注意:隐藏垂直滚动条不是一个好主意。您要么使用 QLineEdit,要么至少应该使 QPlainTextEdit 高一点(self.fontMetrics().height() * 2 + ...),否则如果用户错误地按下 Enter 键,将会非常混乱或用新行粘贴文本。