600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Qt Designer+PyQt5 控件使用经验(不定时随缘更新)

Qt Designer+PyQt5 控件使用经验(不定时随缘更新)

时间:2021-06-22 06:55:05

相关推荐

Qt Designer+PyQt5 控件使用经验(不定时随缘更新)

Qt Designer

灵活使用布局

使用ctrl键多选多个控件,可为选中的控件添加布局:

也可在上侧工具栏找到快捷图标:

以两个控件使用垂直布局(VerticalLayout)为例:

4个Margin属性

设置layout内四周的间隔,可以将此layout内控件与外部控件隔离开。layoutSpacing属性

设置内部控件之间的间隔。layoutStretch属性

调整内部控件站位比(上图显示:0,0,表面两个控件平分该布局空间),根据需要自行调整。

各控件使用各种layout布局整完后,可在窗体全局使用一个布局自动排列各部件,并随窗体大小改变控件大小。

若布局内控件大小不符合要求,如按钮过大,可添加空白占位控件:

示例:

stylesheet

许多基础的控件外观都无法直接在属性编辑器面板设置(如背景色,边框样式等),(Winform yyds!!!),但是可以在控件的styleSheel属性内编辑css代码,设置控件的样式。

藏在角落的styleSheet属性:(若找不到可在Fileter内搜索)

点击空白处,出现三个点的按钮,点击进入编辑器即可编辑css代码:

编辑完有效样式表代码后点击OK即可应用样式。

*表示当前控件及其子控件全部应用的样式;#后紧跟的控件名(不含空格,上图仅为示意)表示该块样式应用于该控件。直接使用控件类名:会影响所有该控件以及控件的子类。

具体样式请自行学习CSS代码。

友情链接:W3 School CSS学习

在文本中使用超链接

以label为例,在text属性,点击【…】:

在弹出的界面选中文字后点击地球样式的图标:(也可直接点击插入链接设置连接显示的文字)

输入URL:

点击【OK】,点击【确定】

可以看到text属性变为了一串html代码。(为方便展示此处显示我添加了换行符,实际上text属性就一行,无伤大雅。)

注:弹窗框QMessageBox的消息也可以使用html代码实现超链接。

<html><head/><body><p><a href=""><span style=" text-decoration: underline; color:#0000ff;">(请选择)</span></a></p></body></html>

然后在底部的【textInteractionFlags】属性,设置以下三种方案,可以实现超链接:

勾选LinksAccessibleByMouse勾选LinksAccessibleByMouse和LinksAccessibleByKeyboard勾选TextBrowserInteraction

参考资料:QLabel实现超链接——百度经验

自定义图标

选择窗体,找到WindowIcon属性点击右边的小三角(▼)(注意不要点到【…】),点击选择文件,可选择图标文件。

选择图标后会在窗口右上角和任务栏显示选择的图标,若任务栏无法显示,参考文章下半部分PyQt5节的自定义图标设置。

PyQt5

事件的绑定

在窗体的init魔法方法中,调用专门用于绑定各种事件的方法。

# 以MainWindow为例,Ui_MyWindow为pyuic转换.ui文件后窗体默认的类名class MyWindow(QMainWindow, Ui_MyWindow):def __init__(self parent=None):super(MyWindow, self).__init__(parent)self.setupUi(self)self.init_bind()def init_bind():self.pushbtn.clicked.connect(self.btn_click)self.rdoBtn.toggled.connect(self.radio_toggle)self.lineEdit.textEdited.connect(self.line_edited)def btn_click(self):# 按钮点击事件passdef radio_toggle(self):# 单选按钮选中/取消选中事件passdef line_edited(self):# 单行文本LineEdit内容编辑事件pass

输入框前端校验

def line_edited(self):# 单行文本LineEdit内容编辑事件txt = self.lineEdit.text()if len(txt) > 20:# 超过长度限制self.set_verify_tip("长度超过20个字符!", "red")return Falsepattern = pile(r"[\W\s]+")# 匹配非英文数字下划线ret = re.findall(pattern, txt)# 若找到匹配则不符合规则if len(ret) > 0:self.set_verify_tip("? 名称不符合标准!", "red")return Falseelse:self.set_verify_tip()return Truedef set_verify_tip(self, tip="?", color="black"):# lblTip:用于显示提示信息的labelself.lblTip.setText(tip)self.lblTip.setStyleSheet(f"color:{color}")

自定义signal(相当于事件)

# 父窗体class MainWindow(QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.setupUi(self)self.init_bind()def show_sub_dialog(self):# 创建子窗体并展示self.child = ChildWidget()# 接收来自子控件的信号并绑定到指定函数self.child.my_signal.connect(self.on_receive)def on_receive(self, sth):# sth:子窗体发送的消息print(sth)# 子控件,也可以为子窗体等class ChildWidget(QWidget):my_signal = QtCore.pyqtSignal(str)def __init__(self, parent=None):super(ConfirmDialog, self).__init__(parent)self.setupUi(self)def send_signal(self, sth):# 用于发送信号,实现交互self.my_signal.emit(sth)

自定义图标

支持所有像素映射格式(*.bmp *.cur *.gif *.icns *.ico *jpeg *jpg *.pbm ".pgm ".png “.ppm *.svg *.svgz *.tga '.tif”.if ".wbmp ".webp *.xbm *.xpm)

class MainWindow(QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.setupUi(self)# 使用相对路径形式window_icon_path = "../icons/icon.ico"# ..表示父文件# 使用绝对路径形式# window_icon_path = "D:/icons/icon.ico"if os.path.isfile(window_icon_path):# 判断图标文件是否存在self.setWindowIcon(QtGui.QIcon(window_icon_path))

若任务栏的图标未生效,可能需要加上:

import ctypesctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("自定义id")

详细说明参考:pyqt任务栏图标问题——野猪力量

QMessageBox消息弹出框

首先需要导入:

from PyQt5.QtWidgets import QMessageBox

普通消息:

information:左边显示一个蓝色的圆内一个白色的 i 图标warning:黄色三角内黑色感叹号critical:红色圈内白色叉question:蓝色圈内白色问号

QMessageBox.information(self, "标题", "内容")

选择性消息(用于二次确认框,关闭窗体等):

reply = QMessageBox.question(self, "标题","内容",QMessageBox.Ok | QMessageBox.Cancel)if reply == QMessageBox.Ok:# 点击了OK的逻辑pass

参考链接:

qt5信息提示框QMessageBox用法(非python语言)

PyQt5的QMessageBox属性及自定义中文按钮——CSDN EmbededCoder(自定义按钮,未试过可行性)

单选按钮 RadioButton

参考资料:PyQt5系列教程(15):单选按钮

使用QButtonGroup将多个单选按钮组合,组内互斥。

若没有使用QButtonGroup,则单选按钮默认为autoExclusive(自动互斥)。启用了自动互斥功能的单选按钮,在同一个父窗口内互斥。

在按钮选中事件(toggled)中可通过btn_group.checkedId()获取选中按钮的id。

使用成组方式可简化按钮的绑定事件。

首先导入:

from PyQt5.QtWidgets import QButtonGroup

class MyWindow(QMainWindow, Ui_MainWindow):# 自定义一个字典列表,用于组内按钮数据存储rdo_btns = [{"id": 0,"msg": "I am the first btn"},{"id": 1,"msg": "I am the second btn"},{"id": 2,"msg": "I am the third btn"},]btn_group = Nonedef __init__(self, parent=None):super(ChooseModeWindow, self).__init__(parent)self.setupUi(self)self.init_btn_group()self.init_bind()def init_bind(self):self.btn_group.buttonToggled.connect(self.radio_toggle)def init_btn_group(self):"""初始化QButtonGroup并将按钮加入组内"""self.btn_group = QButtonGroup(self)self.btn_group.addButton(self.rdoBtn1, self.rdo_btns[0]["id"])self.btn_group.addButton(self.rdoBtn2, self.rdo_btns[1]["id"])self.btn_group.addButton(self.rdoBtn3, self.rdo_btns[2]["id"])def radio_toggle(self):"""QButtonGroup的选择事件"""tip = ""btn_id = self.btn_group.checkedId()# 获取选中的id,若未选中则返回-1if btn_id > -1:tip = self.rdo_btns[btn_id]["msg"]print(tip)

使用QTimer延时执行任务

class MainWindow(QMainWindow, Ui_MainWindow):delayer = Nonedef __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.setupUi(self)def delay_task(self, task, msec: int)"""延迟执行任务: param task: 要执行的任务: param msec: 延迟的时长(毫秒)"""# 初始化QTimer,执行新的任务,否则会执行所有添加过的任务。self.delayer = QtCore.QTimer()self.delayer.timeout.connect(task)self.delayer.setSingleShot(True)# 设置只执行一次self.delayer.start(msec)# 启动def test_delayer(self):# 普通绑定def inner_task_a():self.statusbar.showMessage("I am inner task a")self.delay_task(inner_task_a, 1000)# 1秒后执行设置状态栏消息# 带参数的绑定def inner_task_b(msg):self.statusbar.showMessage(msg)self.delay_task(lambda: inner_task_b("hhh"), 1000)

链接整合

PyQt5基础知识 超详细!!!(含代码)——CSDN kww_

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。