问题描述
我有一个带有只读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,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,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)
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_())```
解决方法
您遇到概念问题:
-
请勿修改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_()