我对 pyqt5 还很陌生,坦率地说,这是我使用这个框架的第一个项目,所以请耐心等待。当我尝试将
sign_up
按钮连接到我的
goto
时,它向用户显示
SignUp
MainWindow,即使具有相同连接功能的其他按钮正常工作,它似乎根本不起作用...我已经去了多次检查我的代码以确保它没有拼写错误,但我还没有找到任何东西。我还想问另一个问题(虽然更笼统),我试图制作的这个应用程序是相当大的应用程序,并且将有大量的小部件(100+ 左右),我计划为每个小部件提供自己的类,并且将它们添加到我的
stack
对象中,就像在附加代码中完成的那样。我觉得当我的应用程序达到这种规模时,结果不会很好,有没有更好的方法可以做到这一点,或者我应该继续以这种方式构建应用程序?
代码: main.py
import random
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.uic import loadUi
def goto(index):
stack.setCurrentIndex(index)
class QuickLogin(QMainWindow):
def __init__(self):
super(QuickLogin, self).__init__()
loadUi("ui/ui files/quicklogin.ui", self)
self.scanner.clicked.connect(self.scan)
self.login_norm.clicked.connect(lambda: goto(1))
def scan(self): # placeholder logic until scanner is set up
num = random.randint(1, 2)
if num == 1:
self.scanner_text.setText(QtCore.QCoreApplication.translate("FingerprintLogin", u"<html><head/><body><p><span style=\" font-size:16pt;\">Scan successful.</span></p></body></html>", None))
self.scanner_pic.setPixmap(QtGui.QPixmap("ui/ui elements/fingerprint icon - confirm.png"))
QTimer.singleShot(3000, self.standby) # placeholder for page change to home page
else:
self.scanner_text.setText(QtCore.QCoreApplication.translate("FingerprintLogin", u"<html><head/><body><p><span style=\" font-size:16pt;\">Scan failed.</span></p></body></html>", None))
self.scanner_pic.setPixmap(QtGui.QPixmap("ui/ui elements/fingerprint icon - error.png"))
QTimer.singleShot(3000, self.standby) # reset to standard scanner text and pic
def standby(self):
self.scanner_text.setText(QtCore.QCoreApplication.translate("FingerprintLogin", u"<html><head/><body><p><span style=\" font-size:16pt;\">Lightly press the scanner to login.</span></p></body></html>", None))
self.scanner_pic.setPixmap(QtGui.QPixmap("ui/ui elements/fingerprint icon - standby.png"))
class Login(QMainWindow): # most logic not set up yet
def __init__(self):
super(Login, self).__init__()
loadUi("ui/ui files/login.ui", self)
self.quick_login.clicked.connect(lambda: goto(0))
self.sign_up.clicked.connect(lambda: goto(2))
class SignUp(QMainWindow): # most logic not set up yet
def __init__(self):
super(SignUp, self).__init__()
loadUi("ui/ui files/signup.ui", self)
self.cancel.clicked.connect(lambda: goto(1))
app = QApplication(sys.argv)
stack = QtWidgets.QStackedWidget()
quicklogin = QuickLogin()
login = Login()
signup = SignUp()
stack.addWidget(quicklogin)
stack.addWidget(login)
stack.setFixedSize(480, 800) # for scaling purposes size is set to 480x800 and not fullscreen
stack.show()
app.exec_()
图片有问题的小部件和按钮: pic
我看到的
signup
小部件没有添加到堆栈中。这就是为什么
goto(2)
不起作用的原因。
以下是修复后的代码:
import random
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.uic import loadUi
def goto(index):
stack.setCurrentIndex(index)
class QuickLogin(QMainWindow):
# ... [QuickLogin 代码保持不变] ...
class Login(QMainWindow):
# ... [Login 代码保持不变] ...
class SignUp(QMainWindow):
# ... [SignUp 代码保持不变] ...
app = QApplication(sys.argv)
stack = QtWidgets.QStackedWidget()
quicklogin = QuickLogin()
login = Login()
signup = SignUp()
stack.addWidget(quicklogin)
stack.addWidget(login)
stack.addWidget(signup) # 将 signup 小部件添加到堆栈中
stack.setFixedSize(480, 800)
stack.show()
app.exec_()
通过将
stack.addWidget(signup)
添加到的主应用程序代码中,
sign_up
按钮现在应该可以按预期工作了。
关于关于应用程序结构的问题,为每个小部件使用单独的类是一个很好的做法,特别是对于大型应用程序。它可以提高代码的可读性、可维护性和可重用性。使用
QStackedWidget
来管理不同的视图也是一种常见且有效的方法。
但是,如果的应用程序变得非常庞大(100 多个小部件),可能需要考虑使用更高级的架构模式,例如:
- 模型-视图-控制器 (MVC) :这有助于将应用程序的数据、用户界面和逻辑分开。
- 模型-视图-视图模型 (MVVM) :这是 MVC 的一种变体,更适合于使用像 PyQt 这样的 GUI 工具包构建的应用程序。
这些模式可以帮助更好地组织代码并使其更易于维护。但是,对于初学者来说,从现有的结构开始,并在必要时逐渐引入这些更高级的概念可能更容易。
标签:python,python-3.x,qt,pyqt5,qstackedwidget From: 78786222