tableWidget_itemClicked(QTableWidgetItem item)
这里的item就是单击的项
还有获取当前项: ui->tableWidget->currentItem();
首先,我照着前面提到的网页,大致画了个界面,包括三个 checkBox、两个 textEdit 和两个 label,分别放在三个 layout 里面大概就是下面这个界面:
保存后会得到一个扩展名为 ui 的文件。比如我得到了一个 RegexTesterui。
然后打开 cmd 命令行,切换到当前目录,输入以下命令: pyuic4 -o regexTesterUipy RegexTesterui,回车,就能根据画好的 ui 文件生成一个 py 文件。这时可以写一个测试脚本来运行一下这个界面。
1 from PyQt4QtGui import 2 from PyQt4QtCore import 3 import sys 4 import regexTesterUi 5 6 class TestDialog(QDialog,regexTesterUiUi_Dialog): 7 def __init__(self,parent=None): 8 super(TestDialog,self)__init__(parent) 9 selfsetupUi(self)10 11 if __name__ == '__main__':12 app=QApplication(sysargv)13 dialog=TestDialog()14 dialogshow()15 appexec_()
运行这个脚本,我们就可以得到刚才画的那个 GUI 界面,并且可以选中三个 checkBox ,在两个 textEdit 里面输入文本。只是除此之外没有任何功能。现在界面已经做好,我们需要做的就是实现高亮匹配数据的功能。
首先我们来完善一下这个类,我们需要的变量为输入的正则表达式、输入的测试数据、三个匹配模式(大小写敏感、多行匹配、点匹配所有)。
1 class RegexTesterDialog(QtGuiQDialog, regexTesterUiUi_Dialog): 2 3 def __init__(self, parent = None): 4 super(RegexTesterDialog, self)__init__(parent) 5 6 selfCI = False # case insensitive (i) 7 selfMB = False # ^$ match at line breaks (m) 8 selfDM = False # dot matched all (s) 9 selfregex = ''10 selfdata = ''11 12 selfui = regexTesterUiUi_Dialog()13 selfuisetupUi(self)
响应功能:
由于这个界面并没有按钮,我需要程序检测到任何一点变动就改变高亮的部分。这里就涉及到 Qt 的信号和槽机制。本文就不复述这些知识,具体可以参考 QT的信号与槽机制介绍。这里我们就要用到 QTextEdit 控件的 textChanged() 信号函数。具体的介绍可以查看 Qt 在线文档。这个信号函数在检测到 QTextEdit 控件中的文本发生了变化的时候会发射一个信号,与其关联的槽函数就会立即执行。而把这个信号函数和槽函数关联起来的方法就是 connect() 方法。这个网上也有很多介绍,这里我来介绍一个更 pythonic 的方法,使用 Python 的装饰器。PyQt中支持同名传递信号,就是说根据控件的名字来自动选择哪个槽。比如这里提到的 textChanged() 信号函数,如果要响应这个文本变化信号,可以这么做:
@QtCorepyqtSlot() # 该装饰器标志此函数为接收信号的槽函数def on_textEdit_Regex_textChanged(self): # 槽函数名标准格式 on_控件名字_信号函数名字
selfregex = selfuitextEdit_RegextoPlainText()
selfuitextEdit_DatasetText(selfregex)
这里在槽函数上面加一个装饰器表示这个函数为接收信号的槽函数,然后根据控件名和信号函数名命名一个槽函数,这里我的接收正则表达式输入的 QTextEdit 控件名为 textEdit_Regex,因此这个槽函数名为 on_textEdit_Regex_textChanged。在这个槽函数里,我们通过 toPlainText() 方法得到文本框中的文本数据,然后将 textEdit_Data 中的数据设置为我们输入的值,这样就可以测试这个槽函数运行是否正确。当测试 textEdit_Data 控件的信号和槽函数时,也可以利用 textEdit_Regex 来输出结果。
除了 QTextEdit 控件,我们的界面还有 QCheckBox 控件。去查一下文档,可以找到这个控件的信号函数为 stateChanged(int)。我们发现这个函数带有一个参数,使用之前的方法会发现无法发射信号,这里我们需要在装饰器和槽函数中加入这个参数:
@QtCorepyqtSlot(int)def on_checkBox_CI_stateChanged(self, value): if selfuicheckBox_CIisChecked():
selfCI = True
selfuitextEdit_DatasetText(‘True’) else:
selfCI = False
selfuitextEdit_DatasetText(‘False')
虽然我们不知道这个参数是什么,但只要加进来,就可以正常使用。同理,碰到需要两个参数的信号函数时,只要再加一个参数就行。这里,当接收到 stateChanged(int) 信号时,我们使用 isChecked() 方法来检查控件是否被选中。如果选中了,则返回真,否则返回假。这里我们同样用到了 QTextEdit 控件来输出结果测试信号是否正确。其他两个 QCheckBox 控件同样设置。
匹配功能:
完成基本的响应函数之后,就要开始实现匹配功能。这里很简单,直接调用 re 模块,使用 findall() 方法。由于有三个 checkBox 提供三种匹配模式:
reI (全拼:IGNORECASE): 忽略大小写(括号内是完整写法,下同)
reM (全拼:MULTILINE): 多行模式,改变'^'和'$'的行为
reS (全拼:DOTALL): 点任意匹配模式,改变''的行为
因此总共有 23 =8 种匹配模式:
1 def matchData(self): 2 if (not selfCI) and (not selfMB) and (not selfDM): 3 pattern = recompile(selfregex) 4 elif (not selfCI) and (not selfMB) and (selfDM): 5 pattern = recompile(selfregex, reS) 6 elif (not selfCI) and (selfMB) and (not selfDM): 7 pattern = recompile(selfregex, reM) 8 elif (not selfCI) and (selfMB) and (selfDM): 9 pattern = recompile(selfregex, reM|reS)10 elif (selfCI) and (not selfMB) and (not selfDM):11 pattern = recompile(selfregex, reI)12 elif (selfCI) and (not selfMB) and (selfDM):13 pattern = recompile(selfregex, reI|reS)14 elif (selfCI) and (selfMB) and (not selfDM):15 pattern = recompile(selfregex, reI|reM)16 elif (selfCI) and (selfMB) and (selfDM):17 pattern = recompile(selfregex, reI|reM|reS)18 19 dataMatched = refindall(pattern, selfdata)这里我们就可以得到匹配好的一个列表。刚开始实现这部分的时候,由于 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 模块处理了。
@QtCorepyqtSlot()def on_textEdit_Regex_textChanged(self):
selfregex = unicode(selfuitextEdit_RegextoPlainText())
selfmatchData()
通过单步调试,我们可以测试上述 dataMatched 列表中的数据是否正确,如果正确,我们就可以继续进行下一步,实现高亮功能。
首先,如果没有安装python和PyQt软件的请先直接搜索下载并安装。python是一个开源软件,因此都是可以在网上免费下载的,最新版本即可。下载完成后,我们先打开PyQt designer。
2
打开后,首先是一个默认的新建窗口界面,在这里我们就选择默认的窗口即可。
3
现在是一个完全空白的窗口。第一步我们要先把所有的设计元素都拖进这个窗口。我们先拖入一个“Label”,就是一个不可编辑的标签。
4
随后我们再拖入一个可以编辑的“Line Edit”
5
最后我们拖入最后一个元素:“PushButton”按钮,也就是平时我们所点的确定。
6
目前我们已经把所有所需要的元素都拖入了新建的窗口。对于每一个元素,我们都可以双击进行属性值的修改,此时我们仅需要双击改个名字即可
7
此时我们已经完成了一半,接下来需要对动作信号进行 *** 作。我们需要先切入编辑信号的模式
8
此时把鼠标移动到任意元素,都会发现其变成红色,代表其被选中。
9
当我们选中pushbutton后,继续拖动鼠标指向上面的line edit,会发现由pushbutton出现一个箭头指向了line edit,代表pushbutton的动作会对line edit进行 *** 作。
10
随即会d出一个配置连接窗口。左边的是pushbutton的 *** 作,我们选择clicked(),即点击pushbutton。
右边是对line edit的 *** 作,我们选择clear(),即清楚line edit中的内容。
最后我们点击确定。
保存完成后,我们在PyQt中的 *** 作就已经完成了。保存的文件名我们命名为test,PyQt生成的设计文件后缀是ui。
然后我们需要把ui文件转换成可编译的py文件,我们需要用到PyQt提供的pyuic4命令来完成转换。这是一个DOS命令,因此我们需要调出DOS *** 作界面。打开开始菜单,找到附件中的运行。
在运行中输入cmd,确定后即可打开DOS界面。
在DOS界面下,我们需要定位到刚才保存的ui文件的位置,如果是默认的话,会保存在C:\Python27\Lib\site-packages\PyQt4,定位的过程如图所示。转换成py文件的命令是:pyuic4 testui -o testpy
转换命令执行后,会生成一个testpy的文件,如图所示
最后我们需要对生成的python文件加入头文件和主函数,就可以生成一个完整的GUI程序了!首先是在整个程序的最开头加入import sys,如图所示。
另外,在程序的末尾,加入如图所示的主函数代码。主函数会调用我们再PyQt里已经完成的生成元素的函数以及配置连接函数,因此我们只需要加上主函数来调用他们即可。
保存后,双击我们编辑完成的python文件,就会d出我们刚才设计的GUI界面啦!这就是我们所完成的第一个用python语言写的GUI程序啦!
可以。
在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话框,在对话框中进行参数的选择,关闭对话框将参数返回给主窗口
pyqt提供了一些标准的对话框类,用于输入数据,修改数据,更改应用的设置等,常见的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之间传参数有两种常用的方式,一种在自定义对话框之间通过属性传参,另一种在窗口之间使用信号与槽机制传参,这里主要介绍第一种
单一窗口的数据传递实例
对于具有单一窗口的程序来说,一个控件的变化会影响另一个控件的变化,这中变化利用信号与槽的关系非常容易解决
以上就是关于pyqt中QTableWidget的勾选框,怎么获取他的勾选状态全部的内容,包括:pyqt中QTableWidget的勾选框,怎么获取他的勾选状态、pyqt5如何做正则表达式验证软件、如何使用pyQT做pythonGUI界面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)