用qt designer画图后导出成py文件。这个文件定义了一个Ui_MainWindow类,然后我在这个类中补充槽函数,并且在自带的setup函数中增加触发机制。现在这个Ui_MainWindow类就定义好了。然后,如果这个界面不是第一个界面的话,我再在同一个py文件中写一个子类(如果是第一个界面的话这一段我放在主程序文件里,不过放哪里应该都不影响):
class StudentLogin(QtWidgets.QMainWindow, Ui_StudentLogin): def __init__(self, parent=None): super(StudentLogin, self).__init__(parent) self.setupUi(self)这样,对应着某个界面的一个py文件就写好了。
实现跳转的方法是,比如,我要从FirstWindow界面跳转到StudentLogin界面,只需要在setup函数中增加self.pushButton_student.clicked.connect(self.on_pushButton_studentNumber_clicked),并且额外再写一个函数:
windowList = [] def on_pushButton_studentNumber_clicked(self): print("点击firstwindow的按钮,即将跳转studentlogin") the_window = StudentLogin() self.windowList.append(the_window) self.close() the_window.show()这样就可以实现在点击pushButton_student这个按钮时,跳转到下一个页面。我本来希望用这种方式让第二个页面还能再跳转到第三个,但是我发现,跳转到第二个页面时仍然是正常的,但跳转到第三个页面时,第三个页面出现了三个。
下面运行主程序文件后出现的第一个页面。
点击学生登录后,第一个页面消失,出现第二个页面。
输入学号 点击登录后,拖开发现居然有三个页面! 我在每一个跳转函数中都写了一个print语句,例如:
def on_pushButton_studentNumber_clicked(self): print("点击firstwindow的按钮,即将跳转到studentlogin") the_window = StudentLogin() self.windowList.append(the_window) self.close() the_window.show() print("点击studentlogin的按钮,即将跳转到studentfunctions") the_window = StudentFunctions() self.windowList.append(the_window) self.close() the_window.show()最后结果是这样的: 居然跳转到studentfunctions跳转了6次。 看起来仅仅是页面多了几个,但是在签到、请假等功能的实现中,这个问题导致同一个sql语句重复执行,最后导致出错。 另:我还尝试过把三个界面放在同一个py文件中,来避免互相import,但是结果是一样的。
其实如果仅仅是不能做三个以上的页面也没什么,但是似乎两个页面的跳转也只能在“不传递信息”的情况下实现,一旦传递信息就又会出现重复执行多次的情况。 学生签到系统需要在多个页面之间传递信息,就是说,在登录页面输入学号和密码成功登录之后,系统应该记住“你是谁”。所以在登录之后,要签到的时候,只需要填课程和周次等,而不需要填自己的名字、学号等信息,因为系统已经知道你是谁了。 实现它的方法是在前一个页面设置全局变量(在我的程序中是STUDENTNUMBER和STUDENTNAME),然后子页面只需要import前一个页面的py文件,就可以使用这个全局变量。 比如,前一个页面StudentLogin2.py中点击按钮会调用的函数是这样的:
windowList = [] def on_pushButton_login_clicked(self): print("点击studentlogin按钮,即将跳转studentfunctions") strSN = self.lineEdit_studentNumber.text() strPW = self.lineEdit_password.text() cnxn = pyodbc.connect( 'DRIVER={SQL Server};SERVER=localhost;DATABASE=register;UID=sa;PWD=gslsgsls') cursor = cnxn.cursor() sql = "select 姓名 from 学生 where 学号="+strSN+" and 密码="+strPW cursor.execute(sql) row = cursor.fetchone()[0] cnxn.close() if row: #获取学生姓名 global STUDENTNAME STUDENTNAME=row # 获取学生学号 global STUDENTNUMBER STUDENTNUMBER = self.lineEdit_studentNumber.text() #跳转页面 print("点击studentLogin的按钮,即将跳转到studentFunctions") the_window = StudentFunctions() self.windowList.append(the_window) self.close() the_window.show() else: self.label_message.setText("登陆失败!")这个函数中就有一段设置全局变量并赋值的代码:
#获取学生姓名 global STUDENTNAME STUDENTNAME=row # 获取学生学号 global STUDENTNUMBER STUDENTNUMBER=self.lineEdit_studentNumber.text()后一个页面StudentFunctions2.py中有一句代码用到了STUDENTNAME这个变量,这句代码可以让左上角的标签出现登陆者的名字:
self.label_hello.setText(_translate("MainWindow", "你好,"+StudentLogin2.STUDENTNAME+"!"))现在我们来看一下效果吧!运行主程序文件: 输入学号密码 点击登录后,左上角确实出现了登陆者的名字,说明传递信息成功了。 但是这个页面拖开来又有三个 这次只有一个跳转,我在跳转处也加了一行print命令,最后的控制台结果是这样的: 另:我也尝试过把两个页面放在一个py文件中,结果仍然是一样的。
如果在前一个页面写一段关于跳转页面的函数,可以实现两个页面间的跳转,但是如果想实现从第一个到第二个、在从第二个到第三个这样三个页面间的跳转,就会出现跳转到第三个页面很多次的问题。另外,如果想在页面间传递信息,那即使只是两个页面之间跳转也会出现跳转到后一个页面很多次的问题。