首页 > 解决方案 > PyQt5 - 为什么我的小部件不更新,除非我切换到不同的窗口?

问题描述

所以我刚开始使用 PyQt5。现在我只编写了 1 个按钮,该按钮应该从行编辑中获取文本,将其存储在全局变量中并将其放入文本浏览器中。现在它做到了......但有问题。在我单击另一个程序/窗口然后再次单击我的应用程序之前,文本浏览器不会更新当行编辑被清除时,有一个错误,基本上是文本没有被正确清除,但只有上半部分。当我再次输入时,这种情况就会消失。

我尝试为小部件和 QApplication.process_events() 调用 .update() 方法

这是代码

from PyQt5 import QtCore, QtGui, QtWidgets

lyrics = ''
adlib = ' (Placeholder adlib)'

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(742, 680)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.addLineBtn = QtWidgets.QPushButton(self.centralwidget)
        self.addLineBtn.setGeometry(QtCore.QRect(530, 0, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setItalic(True)
        self.addLineBtn.setFont(font)
        self.addLineBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.addLineBtn.setObjectName("addLineBtn")
        self.deleteBtn = QtWidgets.QPushButton(self.centralwidget)
        self.deleteBtn.setGeometry(QtCore.QRect(120, 80, 91, 32))
        self.deleteBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.deleteBtn.setObjectName("deleteBtn")
        self.saveBtn = QtWidgets.QPushButton(self.centralwidget)
        self.saveBtn.setGeometry(QtCore.QRect(30, 80, 91, 32))
        self.saveBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.saveBtn.setObjectName("saveBtn")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 20, 501, 51))
        self.lineEdit.setObjectName("lineEdit")
        self.dialLabel = QtWidgets.QLabel(self.centralwidget)
        self.dialLabel.setGeometry(QtCore.QRect(640, 20, 71, 16))
        self.dialLabel.setObjectName("dialLabel")
        self.rtdSlider = QtWidgets.QSlider(self.centralwidget)
        self.rtdSlider.setGeometry(QtCore.QRect(620, 40, 101, 22))
        self.rtdSlider.setOrientation(QtCore.Qt.Horizontal)
        self.rtdSlider.setObjectName("rtdSlider")
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(20, 120, 701, 501))
        self.textBrowser.setObjectName("textBrowser")
        self.noadlibBtn = QtWidgets.QPushButton(self.centralwidget)
        self.noadlibBtn.setGeometry(QtCore.QRect(530, 50, 91, 51))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setItalic(True)
        self.noadlibBtn.setFont(font)
        self.noadlibBtn.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.noadlibBtn.setObjectName("noadlibBtn")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 742, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.addLineBtn.clicked.connect(self.addLineAdlib)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.addLineBtn.setText(_translate("MainWindow", "Adlib"))
        self.deleteBtn.setText(_translate("MainWindow", "Delete"))
        self.saveBtn.setText(_translate("MainWindow", "Save"))
        self.dialLabel.setText(_translate("MainWindow", "RTD Level"))
        self.noadlibBtn.setText(_translate("MainWindow", "No Adlib"))

    def addLineAdlib(self):
        global lyrics
        lyrics += self.lineEdit.text() + adlib + '\n'
        self.lineEdit.clear()
        self.textBrowser.setText(lyrics)
    def addLineNoAdlib(self):
        pass

    def save(self):
        pass

    def deleteLine(self):
        pass


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_())

标签: pythonpython-3.xpyqtpyqt5

解决方案


我发现了和你一样的问题,我使用的是 MacOS Mojave 10.14.6。这个问题可能是操作系统的问题,但是我把pyqt5从最新的5.14.1降级到了稳定版5.9.2,问题就解决了。


推荐阅读