首页 > 编程问答 >pyqt5中带有特定按钮的setCurrentIndex()方法问题

pyqt5中带有特定按钮的setCurrentIndex()方法问题

时间:2024-07-24 10:49:00浏览次数:9  
标签:python python-3.x qt pyqt5 qstackedwidget

我对 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

相关文章

  • Python 中的常量应该大写吗?
    在PEP8中,一般规则是在UPPER_CASE字符中声明常量。在现实生活中,可能有多种情况:#!envpythonDATABASE_HOST='localhost'app=Flask('myapp')base_two=partial(int,base=2)通常我们将字符串类型或数字类型变量视为不可变的,因此是常量,而不是对象或函数。问题是......
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行
    我对Python比较陌生,并试图为我的for循环实现一个多处理模块。我在img_urls中存储了一个图像url数组,我需要下载并应用一些Google视觉。if__name__=='__main__':img_urls=[ALL_MY_Image_URLS]runAll(img_urls)print("---%sseconds---"%(......
  • Python编程时输入操作数错误
    我正在用Python编写下面的代码来模拟控制系统。但是,当我调试代码时,我面临以下问题:matmul:输入操作数1没有足够的维度(有0,gufunc核心,签名为(n?,k),(k,m?)->(n?,m?)需要1)文件“D:\ÁreadeTrabalho\GitHub\TCC\CódigosMarcela\SistemaSISO_tres_estados_new.py”,......
  • Python入门知识点 7--散列类型与字符编码
    1、初识散列类型(无序序列)数据类型分为3种:   前面已经学过了两种类型   1.数值类型:int/float/bool只能存储单个数据      2.序列类型:str/list/tuple,有序的存储多个数据--有序类型,有下标,可以进行索引切片步长操作          3.散列类型......
  • Python入门知识点 6--序列类型的方法
    1、初识序列类型方法序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据也可以对数据进行更方便的操作这个操作就是叫增删改查(crud)(增加(Creat),读取查询(Retrieve),更新(Update),删除(Delete)几个单词的首字母简写)增删改查是操作数据最底层的操作(从本质......
  • Python项目流程图
    我有一个由多个文件夹组成的Python项目,每个文件夹包含多个脚本。我正在寻找一个Python库或软件/包,它们可以生成流程图,说明这些脚本如何互连并绘制出从开始到结束的整个过程。自动生成Python项目流程图确实是一个挑战,目前没有完美通用的解决方案。主要原因是:......
  • 使用 mypy 时Python中的继承和多态性不起作用
    我正在寻找用mypy做一些标准的多态性,我以前从未使用过它,而且到目前为止它并不直观。基类classContentPullOptions:passclassTool(Protocol):asyncdefpull_content(self,opts:ContentPullOptions)->str|Dict[str,Any]:...子类classGoogle......
  • Python函数获取匹配和错误记录
    我有一个以下格式的json文件:[{"type":"BEGIN","id":"XYZ123"},{"type":"END","id":"XYZ123",},{"type":&......
  • python,替换标点符号但保持特殊单词完整的最佳方法
    我正在制作一个调制函数,它将采用带有特殊字符(@&*%)的关键字,并保持它们完整,同时从句子中删除所有其他标点符号。我设计了一个解决方案,但它非常庞大,而且可能比需要的更复杂。有没有一种方法可以以更简单的方式做到这一点。简而言之,我的代码匹配特殊单词的所有实例以查找跨度。然......
  • Python 检测 USB 设备 - IDLE 和 CMD 解释器之间的不同结果
    我正在尝试解决VDI解决方案中智能卡设备的USB重定向问题。我正在使用pyscard模块作为智能卡。对于进一步的上下文,主要问题是当浏览器插件调用用于处理智能卡的python脚本时,未检测到读卡器。关于问题,当我从CMD解释器运行此代码片段时,我收到空列表,表示系统上未找......