简体   繁体   English

在Windows PyQt4 Python 3.5之间切换

[英]Switching between windows PyQt4 Python 3.5

I've looked at multiple solutions from other threads to these problems, but everything I've attempted has not worked. 我已经研究了从其他线程到这些问题的多种解决方案,但是我尝试的所有方法均无效。 I'm trying to open all the frames and just simply switch between them, like you can do in tkinter. 我正在尝试打开所有框架,只是简单地在它们之间切换,就像您可以在tkinter中那样。

Tkinter Code: Tkinter代码:

#Location Of All Frames
    Container = tk.Frame(self)
    Container.pack(side="top", fill="both", expand=True)
    Container.grid_rowconfigure(0, weight=1)
    Container.grid_columnconfigure(0, weight=1)
    self.Container = Container

    #Loop To Select Frames
    self.Frames = {}
    for F in (Login, Admin, User):
        PageName = F.__name__
        Frame = F(parent=Container, controller=self)
        self.Frames[PageName] = Frame

        #Allign Frame
        Frame.grid(row=0, column=0, sticky="nsew")

    #Call Function Show Frame
    self.show_frame(Login)

#Function To Call When Switching Frame
def show_frame(self, PageName):
    #If Instance Not Created, Create Instance
    if PageName not in self.Frames:
        self.Frames[PageName] = PageName(self.Container, self)
    Frame = self.Frames[PageName]
    Frame.tkraise()

I'm trying to recreate this for PyQt4, but so far have been unsuccessful. 我正在尝试为PyQt4重新创建此文件,但到目前为止还没有成功。 What I'm trying to accomplish is. 我想要完成的是。

Start off with the login page. 从登录页面开始。 Login(QtGui.QWidget) And then once login, on button press. 登录(QtGui.QWidget)然后登录后,按下按钮。 Switch to the next window. 切换到下一个窗口。 The program is going to have many different layouts that need to be switched between. 该程序将具有许多不同的布局,需要在它们之间进行切换。

Current Code: 当前代码:

class Application(QtGui.QMainWindow): #This was a solution from someone else that doesn't seem to work
    def __init__(self, parent=None):
        super(Application).__init__(parent)
        self.central_widget = QtGui.QStackedWidget()
        self.setCentralWidget(self.central_widget)
        login_widget = LoginWidget(self)
        login_widget.button.clicked.connect(self.Login)
        self.central_widget.addWidget(login_widget)

    def Login(self):
        logged_in_widget = Admin(self)
        self.central_widget.addWidget(logged_in_widget)
        self.central_widget.setCurrentWidget(logged_in_widget)

This method I also see as inefficient for high number of pages. 对于大量页面,我也认为这种方法效率低下。

class LoginWidget(QtGui.QWidget):
    def __init__(self):
        super(Application, self).__init__()
        self.initUI() #Call Initialize UI function

    def initUI(self):
        self.showFullScreen()
        (...)

    class Admin(QtGui.QWidget):
    def __init__(self):
        super(Application, self).__init__()
        self.initUI() #Call Initialize UI function

    def initUI(self):
        self.showFullScreen()
        (...)

I have not created any other windows yet. 我还没有创建任何其他窗口。

Any help will be appreciated. 任何帮助将不胜感激。

Note: written with py2.7 may need adjustments for py3.5 注意:使用py2.7编写的py3.5可能需要进行调整

Here is a solution where you use qStackedWidget, although i would recommend poping up separate dialogs since putting everything in one widget will possibly slow down your program 这是使用qStackedWidget的解决方案,尽管我建议您弹出单独的对话框,因为将所有内容放在一个小部件中可能会减慢您的程序速度

from PyQt4 import QtGui, QtCore
import sys

class StackedWidget(object):
    def setupUi(self, Dialog):
        Dialog.resize(400, 121)
        self.page = QtGui.QWidget()
        self.stackedWidget = QtGui.QStackedWidget(Dialog)
        self.verticalLayout_3 = QtGui.QVBoxLayout(Dialog)
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.page)
        self.lineEdit = QtGui.QLineEdit(self.page)
        self.verticalLayout_4.addWidget(self.lineEdit)
        self.lineEdit_2 = QtGui.QLineEdit(self.page)
        self.verticalLayout_4.addWidget(self.lineEdit_2)
        self.pushButton = QtGui.QPushButton(self.page)
        self.verticalLayout_4.addWidget(self.pushButton)
        self.stackedWidget.addWidget(self.page)
        self.page_2 = QtGui.QWidget()
        self.verticalLayout_6 = QtGui.QVBoxLayout(self.page_2)
        self.radioButton_2 = QtGui.QRadioButton(self.page_2)
        self.verticalLayout_6.addWidget(self.radioButton_2)
        self.radioButton = QtGui.QRadioButton(self.page_2)
        self.verticalLayout_6.addWidget(self.radioButton)
        self.stackedWidget.addWidget(self.page_2)
        self.verticalLayout.addWidget(self.stackedWidget)
        self.verticalLayout_3.addLayout(self.verticalLayout)
        self.stackedWidget.setCurrentIndex(0)

        self.lineEdit.setPlaceholderText("Login")
        self.lineEdit_2.setPlaceholderText("Password")
        self.pushButton.setText("Sign-In")
        self.radioButton.setText("RadioButton")
        self.radioButton_2.setText("RadioButton")

class MultiFrameWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.ui = StackedWidget()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.signin)

    def signin(self):
        self.ui.stackedWidget.setCurrentIndex(int(self.ui.stackedWidget.currentIndex())+1)

app = QtGui.QApplication(sys.argv)
widget = MultiFrameWidget()
widget.show()
sys.exit(app.exec_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM