在表单完成之前不要更改 QTabWidget 的 TAB

2023-12-02

我试图让用户在填写表格 1 之前不要切换到“表格 2”所在的下一个选项卡。

我尝试了“currentChange”事件,但它没有按照我想要的方式工作,因为它在已经从 TAB 更改时显示警报。

有没有办法让当前的 TAB 保持固定,直到任务完成?

我附上代码和图像

import sys
from PyQt5.QtCore import Qt
from PyQt5 import QtWidgets

class MyWidget(QtWidgets.QWidget):

    def __init__(self):
        super(MyWidget, self).__init__()
        self.setGeometry(0, 0, 800, 500)
        self.setLayout(QtWidgets.QVBoxLayout())

        #flag to not show the alert when starting the program
        self.flag = True

        #changes to True when the form is completed
        self.form_completed = False

        #WIDGET TAB 1
        self.widget_form1 = QtWidgets.QWidget()
        self.widget_form1.setLayout(QtWidgets.QVBoxLayout())
        self.widget_form1.layout().setAlignment(Qt.AlignHCenter)
        label_form1 = QtWidgets.QLabel("FORM 1")
        self.widget_form1.layout().addWidget(label_form1)

        #WIDGET TAB 2
        self.widget_form2 = QtWidgets.QWidget()
        self.widget_form2.setLayout(QtWidgets.QVBoxLayout())
        self.widget_form2.layout().setAlignment(Qt.AlignHCenter)
        label_form2 = QtWidgets.QLabel("FORM 2")
        self.widget_form2.layout().addWidget(label_form2)

        #QTABWIDGET
        self.tab_widget = QtWidgets.QTabWidget()
        self.tab_widget.currentChanged.connect(self.changed)
        self.tab_widget.addTab(self.widget_form1,"Form 1")
        self.tab_widget.addTab(self.widget_form2, "Form 2")

        self.layout().addWidget(self.tab_widget)

    def changed(self,index):
        if self.flag:
            self.flag = False
            return

        if not self.form_completed:
            QtWidgets.QMessageBox.about(self, "Warning", "You must complete the form")
            return

if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    mw = MyWidget()
    mw.show()
    sys.exit(app.exec_())

QTabWidgetProgram


The currentChanged当索引已经改变时发出信号(动词是过去时:Changed),所以如果你想prevent更改后,您必须检测任何用户尝试切换选项卡。

为此,您必须检查鼠标和键盘事件:

  • 鼠标左键单击选项卡栏;
  • Ctrl+Tab and Ctrl+Shift+Tab on the tab widget;

由于您必须从主窗口控制该行为,唯一的解决方案是在选项卡小部件及其上安装事件过滤器tabBar(),那么如果该操作会更改索引但表单未完成,则必须返回True这样该事件就不会被小部件处理。

请考虑以下假设必须保持活动的选项卡是current(第一个添加的选项卡,或使用设置的选项卡setCurrentIndex()).

class MyWidget(QtWidgets.QWidget):
    def __init__(self):
        # ...
        self.tab_widget.installEventFilter(self)
        self.tab_widget.tabBar().installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == event.KeyPress and \
            event.key() in (Qt.Key_Left, Qt.Key_Right):
                return not self.form_completed
        elif source == self.tab_widget.tabBar() and \
            event.type() == event.MouseButtonPress and \
            event.button() == Qt.LeftButton:
                tab = self.tab_widget.tabBar().tabAt(event.pos())
                if tab >= 0 and tab != self.tab_widget.currentIndex():
                    return self.isInvalid()
        elif source == self.tab_widget and \
            event.type() == event.KeyPress and \
            event.key() in (Qt.Key_Tab, Qt.Key_Backtab) and \
            event.modifiers() & Qt.ControlModifier:
                return self.isInvalid()
        return super().eventFilter(source, event)
    def isInvalid(self):
        if not self.form_completed:
            QTimer.singleShot(0, lambda: QtWidgets.QMessageBox.about(
                self, "Warning", "You must complete the form"))
            return True
        return False

请注意,我使用 QTimer 显示消息框,以便立即正确返回事件过滤器。

另请考虑,在对象创建和配置结束时连接信号是一种很好的做法,这对于通知属性更改的信号更为重要:在设置可能触发它的属性之前,不应连接它。
由于空的 QTabWidget 有一个-1索引,一旦添加第一个选项卡,索引就会更改为0,从而触发信号。只需移动currentChanged信号连接after添加选项卡,您可以摆脱self.flag check.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在表单完成之前不要更改 QTabWidget 的 TAB 的相关文章

  • Python 2.7 将比特币私钥转换为 WIF 私钥

    作为一名编码新手 我刚刚完成了教程 教程是这样的 https www youtube com watch v tX XokHf nI https www youtube com watch v tX XokHf nI 我想用 1 个易于阅读
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 有没有办法在每个特定的时间间隔运行 python Flask 函数并在本地服务器上显示输出?

    我正在使用 Flask 工作 python 程序 我想从字典中提取键 该密钥为文本格式 但我想在每个特定的时间间隔后重复上述整个过程 并每次在本地浏览器上显示此输出 我已经使用flask apscheduler尝试过这个 程序只运行一次并显
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • PyMC3-自定义 theano Op 进行数值积分

    我使用 PyMC3 进行参数估计 使用必须定义的特定似然函数 我用谷歌搜索了一下 发现我应该使用densitydist实现用户定义的似然函数的方法 但它不起作用 如何在 PyMC3 中合并用户定义的似然函数并找出最大 aposteriori
  • Pandas 滚动窗口 Spearman 相关性

    我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和 或 Pearson 相关性 我努力了df corr df col1 rolling P corr df col2 P为窗口尺寸 但我似乎无法定义该方法 添加meth
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • Python]将两个文本文件合并为一个(逐行)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是蟒蛇新手 我想做的是将文件 a 和文件 b 逐行合并到一个文件中 例如 text file a a n b n c text fi
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 为什么 smtplib.SMTP().sendmail 不发送 DKIM 签名邮件

    我已经在服务器上设置了 postfix 以及 openDKIM 当我跑步时 echo Testing setup mail s Postfix test my email address 我收到电子邮件 邮件标题中有一个DKIM Signa
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro

随机推荐

  • Pandas 中的转换与聚合

    对 Pandas DataFrame 进行分组时 我应该何时使用transform我什么时候应该使用aggregate 怎么办 它们在实践中的应用有所不同 您选择哪一种 考虑更重要 考虑数据框df df pd DataFrame dict
  • ARM 编译错误,VFP 寄存器由可执行文件使用,而不是目标文件

    过去几天我一直遇到这个问题 我无法弄清楚这里到底发生了什么 或者问题是什么 我有一个带有这些标志的 makefile CC arm linux gnueabihf gcc 4 6 FLAGS O3 march armv7 a mtune c
  • FunctionK 类型参数的界限

    我在用着cats 自由单子 这是代数的简化版本 sealed trait Op A object Op final case class Get T name String extends Op T type OpF A Free Op A
  • Excel VBA 从多个 SharePoint 文件夹上传/下载

    我在 Internet 上找到了使用 VBA 从 SharePoint 文件夹下载文件的示例代码 在资源管理器中打开 映射到驱动器号等 因此 我编写了以下代码 Dim sharepointFolder As String Dim colDi
  • 列表视图中以0x8007000为前缀的计划任务返回码,在事件日志中注册为0

    我目前正在尝试在 Zabbix 中设置对 Windows 计划任务的监控 只需监视通过 201 事件过滤的 Microsoft Windows TaskScheduler Operational 事件日志并在返回代码上进行正则化似乎很容易
  • Python:带参数的多处理函数[重复]

    这个问题在这里已经有答案了 我有一些 python 函数可以从远程主机读取文件并处理其内容 我已将所有这些函数放在一个 python 文件中来运行 但问题是每个函数直到前一个函数完成其工作后才开始运行 这会花费不必要的时间 我考虑过并行运行
  • SDK Manager.exe 不起作用

    当我单击 Program Files 上的 SDK Manager 或在中运行它时cmd 什么都没发生 我做了 安装了最新的JDK 安装最新的Android SDK 设置环境JAVA HOME并将 JAVA HOME bin放入路径变量 实
  • 无法解析类型“JNICALL”,?

    我正在尝试在 Eclipse 中使用 NDK 但是当遵循教程时 会弹出此错误 我不明白它来自哪里 这是我的 h 文件 DO NOT EDIT THIS FILE it is machine generated include
  • 为什么非成员函数不能用于重载赋值运算符?

    赋值运算符可以使用成员函数重载 但不能使用非成员函数重载friend功能 class Test int a public Test int x a x friend Test operator Test obj1 Test obj2 Tes
  • 使用 Kafka 主题后发送 HTTP 响应

    我目前正在编写一个包含大量微服务的 Web 应用程序 我目前正在探索如何在所有这些服务之间正确通信 并且我决定坚持使用消息总线 或更具体地说是 Apache Kafka 然而 我有一些问题 我不确定如何从概念上解决 我使用 API 网关服务
  • 将字符串拆分为数组而不删除分隔符?

    我有一个像这样的字符串 asdf a b c2 我想将它分成一个数组 如下所示 asdf a b c2 Using string split 删除空格 结果是 asdf a b c2 我想到插入额外的分隔符 例如 string replac
  • Python GraphQL API 调用组合

    我最近开始学习如何使用 python 但在 graphQL api 调用方面遇到了一些问题 我正在尝试设置一个循环来使用分页获取所有信息 并且我的第一个请求工作得很好 values query organizations ids pipes
  • 使用 Motorola Moto G(或 Moto X)录制立体声音频

    我希望有人能帮助我解决这个问题 不久前 我开发了一个应用程序 以便同时录制智能手机中前置麦克风和后置麦克风捕获的声音 基本上 我像这样制作下一个对象 音频记录 音频记录 新音频记录 MediaRecorder AudioSource CAM
  • RawPy 对象中的颜色矩阵是什么?

    我正在读取尺寸为 3120 x 4208 的 DNG 图像RawPy dng rawpy imread TestImages IMG 20200108 161323 dng 调试的时候看到dng有一个名为color matrix 形状为 3
  • swift - if 语句和数组

    我想将 DicX 中的字符串与现有标题 根据单元格选择而变化的表格标题 进行匹配 var DicX xx yy zz qq let DicYY 11 22 33 44 1 2 3 4 m n k b bb kk mm nn 我正在比较的标题
  • 从可能未格式化为表格的网页中提取数据

    首先 我绝不是 VBA 专家 只要知道得足够多就会很危险 8 我首先搜索了如何从网页中提取表格 发现很多人都问了同样的问题 不幸的是 我读到的大部分内容都超出了我的理解范围 我读过的一篇文章向我指出了这一点详细文章作者 Siddharth
  • asp.net MVC 有应用程序变量吗?

    我正忙于将 Web 应用程序转换为 MVC 并将一些信息保存到跨多个租户 帐户使用的应用程序变量中 以提高效率 我意识到 MVC 的要点是尽可能保持无状态 会话状态显然在 MVC 中具有并存在是有意义的 但我们不想只将应用程序转换为会话变量
  • 如何使用支持 __LINE__ 和 __FILE__ 的内联函数替换 C++ 异常宏?

    我目前正在阅读 Scott Meyers 的 Effective C 一书 它说我应该更喜欢inline功能超过 define对于类似函数的宏 现在我尝试编写一个内联函数来替换我的异常宏 我的旧宏看起来像这样 define EXCEPTIO
  • 所有边的edge_index都为零?

    定义我的boost graph如下所示 我得到所有边的边索引为零 为什么 我究竟做错了什么 include
  • 在表单完成之前不要更改 QTabWidget 的 TAB

    我试图让用户在填写表格 1 之前不要切换到 表格 2 所在的下一个选项卡 我尝试了 currentChange 事件 但它没有按照我想要的方式工作 因为它在已经从 TAB 更改时显示警报 有没有办法让当前的 TAB 保持固定 直到任务完成