【问题标题】:PyQt5 changing QlineEdit text automaticallyPyQt5 自动更改 QlineEdit 文本
【发布时间】:2020-08-10 22:57:53
【问题描述】:

我有一个带有只读 QlineEdit 的主窗口,它显示今天的日期和一个打开日历小部件窗口(来自项目中的另一个模块)以选择另一个日期的按钮,当我选择另一个日期时 QlineEdit 文本的问题虽然存储值的变量成功更改,但在 Gui 中没有更改,我搜索了很多没有线索

  • 在使用 QlineEdit 之前,我尝试了 Qlabel,但也无法达到结果

这里是主窗口:

import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit
from PyQt5 import QtCore, QtGui, QtWidgets
from cal_window import prev_day, today_str, UiCalWindow


class MainWindow(QMainWindow):


    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setWindowTitle("My App")
        self.setGeometry(50, 50, 800, 600)

        self.label = QLineEdit(self)
        self.label.setFont(QFont("Arial", 20))

        self.label.setReadOnly(True)
        self.label.setText(today_str)

        self.setCentralWidget(self.label)

        self.btn = QPushButton('open calender', self)
        self.btn.move(50, 50)
        self.btn.clicked.connect(self.choose_date)


    def choose_date(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = UiCalWindow()
        self.ui.setupUi(self.window)
        self.window.show()



app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

这里是日历子窗口:

from PyQt5 import QtCore, QtGui, QtWidgets, Qt
from datetime import date




today = date.today()
today_str = today.strftime("%Y-%m-%d")
prev_day = "2000-01-01"


class UiCalWindow(object):

    def get_date(self, qDate):
        global prev_day
        self.day = '{0}-{1}-{2}'.format(qDate.year(), qDate.month(), qDate.day())
        prev_day = self.day
        print(prev_day)

    def setupUi(self, cal_window):
        cal_window.setObjectName("cal_window")
        cal_window.setWindowModality(QtCore.Qt.ApplicationModal)
        cal_window.resize(800, 600)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        cal_window.setFont(font)
        self.centralwidget = QtWidgets.QWidget(cal_window)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWeight(75)
        self.calendarWidget.setFont(font)
        self.calendarWidget.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.calendarWidget.setFirstDayOfWeek(QtCore.Qt.Monday)
        self.calendarWidget.setGridVisible(True)
        self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.NoVerticalHeader)
        self.calendarWidget.setObjectName("calendarWidget")
        self.gridLayout.addWidget(self.calendarWidget, 0, 0, 1, 1)
        self.calendarWidget.clicked.connect(self.get_date)
        self.ok_dt_btn = QtWidgets.QPushButton(self.centralwidget)
        self.ok_dt_btn.setMinimumSize(QtCore.QSize(0, 50))
        self.ok_dt_btn.setObjectName("ok_dt_btn")
        self.ok_dt_btn.clicked.connect(cal_window.close)
        self.gridLayout.addWidget(self.ok_dt_btn, 1, 0, 1, 1)
        cal_window.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, cal_window):
        _translate = QtCore.QCoreApplication.translate
        cal_window.setWindowTitle(_translate("cal_window", "MainWindow"))
        self.ok_dt_btn.setText(_translate("cal_window", "go"))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    cal_window = QtWidgets.QMainWindow()
    ui = UiCalWindow()
    ui.setupUi(cal_window)
    cal_window.show()
    sys.exit(app.exec_())```

【问题讨论】:

  • 首先,永远,永远编辑pyuic生成的文件的内容(阅读更多关于using Designer的信息以了解如何正确使用这些文件)。那么,为什么要在choose_date 中创建一个新的 MainWindow 实例?这是没有意义的:如果你想更改标签的文本,只需使用self.label.setText()
  • @musicamante 感谢您的建议,如果您用代码示例阐明您的第二点以便更好地理解,我会更高兴。 - 该代码中的想法是我从 youtube 视频中得到的,所以如果你能指导我找到更好的,我将不胜感激

标签: python user-interface pyqt qlineedit


【解决方案1】:

你有概念问题:

  • 不要修改Qt Designer生成的代码(建议恢复cal_window.py。

  • 不要使用全局变量,它们是不必要的,而且会产生比解决方案更多的问题。

  • 变量“prev_day”被更新并不意味着QLabel显示的文本被更新,QLabel复制信息,不监控字符串。

逻辑是使用信号更新文本。

import sys
from PyQt5.QtCore import pyqtSignal, QDate
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit
from cal_window import UiCalWindow


class CalendarWindow(QMainWindow, UiCalWindow):
    def __init__(self, parent=None):
        super(CalendarWindow, self).__init__(parent)
        self.setupUi(self)


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.setWindowTitle("My App")
        self.setGeometry(50, 50, 800, 600)

        self.label = QLineEdit(self)
        self.label.setFont(QFont("Arial", 20))
        self.label.setReadOnly(True)

        self.setCentralWidget(self.label)

        self.btn = QPushButton("open calender", self)
        self.btn.move(50, 50)

        self.cal = CalendarWindow()
        self.cal.calendarWidget.clicked.connect(self.handle_date_clicked)
        self.btn.clicked.connect(self.cal.show)

    def handle_date_clicked(self, date):
        self.label.setText(date.toString("yyyy-MM-dd"))


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多