首页 > 电脑 > pyqt 装饰器自动连接信号与槽 没有作用

pyqt 装饰器自动连接信号与槽 没有作用

电脑 2026-07-31

使用pyqt4写GUI小程序时一个clicked信号调用三次槽函数

有时我们展示了一个列表, 并想提供查看某项列表的详细内容, 我们会在列表项的末端加一个查看按钮, 这时我们如何在按按钮的时候得知这是那一项呢? 这时就需要带参数的信号, 信号是可以带参数的, 参数会在信号发送时携带, 并传递给接收此信号的槽 from PyQt4 import QtGui, QtCore class MyButton(QtGui.QPushButton): myclicked = QtCore.pyqtSignal(int) def __init__(self, _id, *args, **kwargs): QtGui.QPushButton.__init__(self, *a

pyqt5如何做正则表达式验证软件

首先,我照着前面提到的网页,大致画了个界面,包括三个 checkBox、两个 textEdit 和两个 label,分别放在三个 layout 里面大概就是下面这个界面:

保存后会得到一个扩展名为 .ui 的文件。比如我得到了一个 RegexTester.ui。

然后打开 cmd 命令行,切换到当前目录,输入以下命令: pyuic4 -o regexTesterUi.py RegexTester.ui,回车,就能根据画好的 ui 文件生成一个 py 文件。这时可以写一个测试脚本来运行一下这个界面。

1 from PyQt4.QtGui import * 2 from PyQt4.QtCore import * 3 import sys 4 import regexTesterUi 5 6 class TestDialog(QDialog,regexTesterUi.Ui_Dialog): 7 def __init__(self,parent=None): 8 super(TestDialog,self).__init__(parent) 9 self.setupUi(self)10 11 if __name__ == '__main__':12 app=QApplication(sys.argv)13 dialog=TestDialog()14 dialog.show()15 app.exec_()

运行这个脚本,我们就可以得到刚才画的那个 GUI 界面,并且可以选中三个 checkBox ,在两个 textEdit 里面输入文本。只是除此之外没有任何功能。现在界面已经做好,我们需要做的就是实现高亮匹配数据的功能。

首先我们来完善一下这个类,我们需要的变量为输入的正则表达式、输入的测试数据、三个匹配模式(大小写敏感、多行匹配、点匹配所有)。

1 class RegexTesterDialog(QtGui.QDialog, regexTesterUi.Ui_Dialog): 2 3 def __init__(self, parent = None): 4 super(RegexTesterDialog, self).__init__(parent) 5 6 self.CI = False # case insensitive (i) 7 self.MB = False # ^$ match at line breaks (m) 8 self.DM = False # dot matched all (s) 9 self.regex = ''10 self.data = ''11 12 self.ui = regexTesterUi.Ui_Dialog()13 self.ui.setupUi(self)

响应功能:

由于这个界面并没有按钮,我需要程序检测到任何一点变动就改变高亮的部分。这里就涉及到 Qt 的信号和槽机制。本文就不复述这些知识,具体可以参考QT的信号与槽机制介绍。这里我们就要用到 QTextEdit 控件的 textChanged() 信号函数。具体的介绍可以查看 Qt在线文档。这个信号函数在检测到 QTextEdit 控件中的文本发生了变化的时候会发射一个信号,与其关联的槽函数就会立即执行。而把这个信号函数和槽函数关联起来的方法就是 connect() 方法。这个网上也有很多介绍,这里我来介绍一个更 pythonic 的方法,使用 Python 的装饰器。PyQt中支持同名传递信号,就是说根据控件的名字来自动选择哪个槽。比如这里提到的 textChanged() 信号函数,如果要响应这个文本变化信号,可以这么做:

@QtCore.pyqtSlot() # 该装饰器标志此函数为接收信号的槽函数def on_textEdit_Regex_textChanged(self): # 槽函数名标准格式 【on_控件名字_信号函数名字】
self.regex = self.ui.textEdit_Regex.toPlainText()
self.ui.textEdit_Data.setText(self.regex)

这里在槽函数上面加一个装饰器表示这个函数为接收信号的槽函数,然后根据控件名和信号函数名命名一个槽函数,这里我的接收正则表达式输入的 QTextEdit 控件名为 textEdit_Regex,因此这个槽函数名为 on_textEdit_Regex_textChanged。在这个槽函数里,我们通过 toPlainText() 方法得到文本框中的文本数据,然后将 textEdit_Data 中的数据设置为我们输入的值,这样就可以测试这个槽函数运行是否正确。当测试 textEdit_Data 控件的信号和槽函数时,也可以利用 textEdit_Regex 来输出结果。

除了 QTextEdit 控件,我们的界面还有 QCheckBox 控件。去查一下文档,可以找到这个控件的信号函数为 stateChanged(int)。我们发现这个函数带有一个参数,使用之前的方法会发现无法发射信号,这里我们需要在装饰器和槽函数中加入这个参数:

@QtCore.pyqtSlot(int)def on_checkBox_CI_stateChanged(self, value): if self.ui.checkBox_CI.isChecked():
self.CI = True
self.ui.textEdit_Data.setText(‘True’) else:
self.CI = False
self.ui.textEdit_Data.setText(‘False')

虽然我们不知道这个参数是什么,但只要加进来,就可以正常使用。同理,碰到需要两个参数的信号函数时,只要再加一个参数就行。这里,当接收到 stateChanged(int) 信号时,我们使用 isChecked() 方法来检查控件是否被选中。如果选中了,则返回真,否则返回假。这里我们同样用到了 QTextEdit 控件来输出结果测试信号是否正确。其他两个 QCheckBox 控件同样设置。

匹配功能:

完成基本的响应函数之后,就要开始实现匹配功能。这里很简单,直接调用 re 模块,使用 findall() 方法。由于有三个 checkBox 提供三种匹配模式:

  • re.I (全拼:IGNORECASE): 忽略大小写(括号内是完整写法,下同)

  • re.M (全拼:MULTILINE): 多行模式,改变'^'和'$'的行为

  • re.S (全拼:DOTALL): 点任意匹配模式,改变'.'的行为

  • 因此总共有 23=8 种匹配模式:

  • 1 def matchData(self): 2 if (not self.CI) and (not self.MB) and (not self.DM): 3 pattern = re.compile(self.regex) 4 elif (not self.CI) and (not self.MB) and (self.DM): 5 pattern = re.compile(self.regex, re.S) 6 elif (not self.CI) and (self.MB) and (not self.DM): 7 pattern = re.compile(self.regex, re.M) 8 elif (not self.CI) and (self.MB) and (self.DM): 9 pattern = re.compile(self.regex, re.M|re.S)10 elif (self.CI) and (not self.MB) and (not self.DM):11 pattern = re.compile(self.regex, re.I)12 elif (self.CI) and (not self.MB) and (self.DM):13 pattern = re.compile(self.regex, re.I|re.S)14 elif (self.CI) and (self.MB) and (not self.DM):15 pattern = re.compile(self.regex, re.I|re.M)16 elif (self.CI) and (self.MB) and (self.DM):17 pattern = re.compile(self.regex, re.I|re.M|re.S)18 19 dataMatched = re.findall(pattern, self.data)

  • 这里我们就可以得到匹配好的一个列表。刚开始实现这部分的时候,由于 Python 的 re 模块接收的参数类型是 Python string,而 PyQt 中控件得到的数据是 QString,一直报错,我一度准备使用 Qt 的 QRegExp 类来进行正则表达式匹配。但是查找文档查了好久,只找到一个改变大小写敏感的函数,找不到设置多行匹配和点匹配所有的方法,于是我去 stackoverflow 上问了个问题:Can QRegExp do MULTILINE and DOTALL match?得到了一个详细的答案,一个解决问题的简单方法就是使用 unicode() 方法将 QString 转换成 python string,而一般不用将 python string 转换成 QString,因为接收 QString 类型参数的函数会自动将python string 转换成 QString。这样,我们直接在两个 QTextEdit 控件的槽函数中将得到的文本数据转换成 python string,就可以交给 re 模块处理了。

  • @QtCore.pyqtSlot()

  • def on_textEdit_Regex_textChanged(self):

  • self.regex = unicode(self.ui.textEdit_Regex.toPlainText())

  • self.matchData()

  • 通过单步调试,我们可以测试上述 dataMatched 列表中的数据是否正确,如果正确,我们就可以继续进行下一步,实现高亮功能。

为什么有wifi信号却连不上网

1、查看手机设置 查看状态栏是否有WiFi图标,或进入设置--WLAN,查看是否已成功连接WiFi。另外进入设置--其他网络与连接--私人DNS,查看是否设置了私人DNS,如有开启,建议将私人DNS设置为关闭再重试。 2、排查WiFi 请对比其它手机连接相同WiFi是否正常,确认是WiFi还是手机原因。如是WiFi原因,请重启无线路由器查看。部分公共WiFi需要通过浏览器认证后才能联网。 3、查看联网权限 请进入手机的i管家--流量管理/流量监控--联网管理 或 设置应用与权限--权限管理,查看应用联网权限是否已开启。 4、排查环境原因 如果手机距离路由器较远,虽然显示有WiFi信号,但实际可

Python培训哪里最好?

那么为了避免这种情况的出现,我们可以参照以下几种筛选方法,选出适合自己的培训机构。

一、看培训机构的品牌、信誉和历史

随着Python的火热,出现了很多新的Python培训机构。这些培训机构多是应市场的需求而出现,缺乏培训的经验积累和历史沉淀。培训机构品牌和信誉相当重要,这是给学员的首要保障。

二、千万要看讲师水平

Python培训的讲师选择是你必须要仔细分析的。不管是足够的工作经验,还是足够的教学经验都是必不可少的,缺一不可。
还有不少黑心培训学校为了节约成本,不管学生能否切实掌握Python开发技能,低价聘请新手Python开发者当讲师,或者让其他学科讲师现学Python充当讲师,耽误了无数学生的未来。

三、环境和氛围很重要

在选择培训课程时,不能简单地认为“贵的就是好的”。可能大家也知道“孟母三迁”的故事。而且,环境可以造就人,但也可能毁掉一个人。可见环境对大家的Python学习影响很大。

而且,如果没有良好的学习氛围,你还有心情学习下去吗?此外,你也可以要求Python培训机构提供试听的机会。

四、要看是否有实操机会

如果你参加了Python培训机构却只会理论,不懂实际操作,请问还有哪家公司会用你呢?因此实操项目对于学员来说尤为重要。

还有,项目实战一定要是根据企业用人需要研发的。如果都是在潮流之外的,甚至已经被淘汰的Python技术,学得再好又有什么用呢?

五、了解自身所需,不被价格左右

学员在选择培训机构前必须想清楚课程的设置是否适合自己,老师的经历是否能满足职业生涯发展或企业解决方案……主动考虑清楚而非被动地入座。

在选择培训机构时,不要受到培训费用的影响,贵的不一定是好的,相对便宜的也不一定是坏的,关键是是否适合自己的需要。
另外,题主还提到:不知道*男孩、*cto这两家怎么样,不知道两个是不是同一家。我只想说,一定要去实地考察,试学一两个星期看看。

这样你才能知道机构的学习氛围,老师是不是认真负责,才能真正了解自己是否适合从事Python方面的工作。

有些培训机构只重视临时利益,教学质量差,"一锤子交易"现象严峻。还有一些Python培训机构既没有标准化教材及教学方法,没有正规教师,更没有契合市场主流的培训课程。捣乱了市场秩序,也极大地影响了培训业的健康发展。

在这里,还想跟你说一点:正所谓“师傅领进门,修行靠个人”,所以如果你自己不花时间,不肯下功夫苦学,无论Python培训机构再怎么好,也不能保证你找到好工作。

电视机没有频道节目怎么调试?

1、检查电视机的信号源输入是否有问题导致电视机恢复出厂设置后没有信号,即检查电视机与有线电视或数字电视机顶盒的连接线路是否出现松动,将其重新连接并固定好再执行自动搜台即可。 2、检查电视机的信号源模式是否已经正确切换,如果连接了有线电视信号,则直接切换为TV模式,再进行自动搜台;如果连接了数字电视机顶盒,则应该将电视机的信号源切换为AV模式,再用机顶盒的遥控器执行自动搜台才会有信号。 3、如果以上问题排查后仍然没信号,基本是电视机的系统有问题或者硬件有问题,应该联系电视机的售后服务为电视机重新刷入新系统;如果是硬件出现问题,如高频头、信号输入接口故障等,由售后服务进行故障排除和零部件更换即可解

标签:python 编程语言 信息技术 编程 Python入门

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved. 京ICP备11019930号-18