qt designer 关于多页面跳转之后同一个页面出现多次的问题

用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文件中,结果仍然是一样的。

总结

如果在前一个页面写一段关于跳转页面的函数,可以实现两个页面间的跳转,但是如果想实现从第一个到第二个、在从第二个到第三个这样三个页面间的跳转,就会出现跳转到第三个页面很多次的问题。另外,如果想在页面间传递信息,那即使只是两个页面之间跳转也会出现跳转到后一个页面很多次的问题。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt Designer是一款强大的设计工具,用于创建并轻松管理图形用户界面(GUI)。Qt Stacked Widget是Qt widget库一个窗口控件,用于在同一位置显示一组窗口小部件,每次只能显示一个小部件。使用Qt Designer设计Stacked Widget的页面切换可以让用户轻松切换页面,使应用程序更加易于使用和导航。 要实现页面切换,首先需要在Qt Designer创建一个Stacked Widget。使用Qt Designer的插件窗口,您可以从可用控件列表选择Stacked Widget并将其拖放到主窗口。然后,您可以在Stacked Widget添加多个页面。每个页面都是一个小部件。或者,您可以使用预定义的页面模板。 在每个页面的设计模式下,您可以添加其他控件,例如文本框,标签,按钮等。您可以调整每个小部件的大小和布局,以使其在Stacked Widget的显示效果最佳。然后,您需要将每个小部件与Stacked Widget关联,以便在应用程序切换页面。 为此,请在Qt Designer的属性编辑器选择Stacked Widget。然后,单击右上角的“添加页”按钮,添加与每个小部件对应的新页。可以通过单击Stacked Widget的页标题来更改每个页的名称。 开始进行页面的切换。最常使用的方法之一是在菜单栏或其他控件上添加按钮,以在单击时触发页面切换。为此,请在Qt Designer添加按钮,然后确保选每个按钮并按Ctrl + D创建它们的副本。更改每个按钮的标签以显示对应页面的名称。然后,选择每个按钮,并单击Qt Designer的“与可见页面”按钮,以在每个按钮和页面之间设置映射关系。 在代码,您需要使用QStackedWidget类的setCurrentIndex函数来切换页面。可以通过使用编号或与每个按钮关联的索引来指定要显示的页面。 总之,使用Qt Designer设计Stacked Widget页面切换可以使用户更轻松地浏览和导航应用程序页面。在Qt Designer的视觉编辑器和属性编辑器轻松添加多个页面,并为每个页面添加设计元素,以便用户可以看到和使用应用程序的主要功能。然后,通过为每个按钮设置映射关系,让用户单击按钮来切换页面。在代码使用setCurrentIndex函数指定要显示的页面
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值