【PyQt】记录各种组件的使用方法
使用Python开发GUI界面工具,通常可用选择PyQt框架,非常易使用,而且网上也有很多相关的文档分享。我也是在写了多个GUI界面后,自己整理了一些常用的使用文档,在此分享给大家(PyQt4~PyQt5适用)。
样式表
官网连接https://doc.qt.io/qt-5/stylesheet-examples.html,通过QSS样式可用将界面进行美化,幸好官网提供了比较详细的说明,可用去官网查看。
1 /** 2 #evilButton 这个evilButton来自setObjectName 3 语法和css类似 4 */ 5 QPushButton#evilButton { 6 background-color: red; 7 border-style: outset; 8 border-width: 2px; 9 border-color: beige; 10 }
FindWidget 找widget
有时候我们创建了很多的组件,但是不会每个组件都保持下来,可用通过查找的方式得到。
1 widget = Container 2 # 某个父容器widget.findChild(QLabel, "xx") 3 # 找他里面的objectName为xx的QLabel。 4 # 遍历找 5 for child in widget.children(): 6 if isinstance(child, QLabel) # 按类型 7 if child.objectName() == "xx" # 按objectName
QTreeWidget 树形控件
1 nav = QTreeWidget() 2 for name in some_list: 3 item = QTreeWidgetItem(nav) 4 if name is list: # 如果还有子节点 5 for child in name: 6 c_node = QTreeWidgetItem(item) 7 # 通过QTreeWidgetItem创建子节点,子节点的子节点继续使用QTreeWidgetItem,parent为父节点。 8 # 设置节点的icon 9 icon = QIcon() 10 item.setIcon(icon)
QListWidget 列表控件
1 listw = QListWidget() 2 # 生成列表,待自定义的widget 3 item = QListWidgetItem() 4 item_content_widget = QWidget() #-->创建Qwidget并在里面填充所需的内容,例如加label,加checkbox等 5 item.setSizeHint(item_content_widget.sizeHint()) # 一定要调用这个设置列表每列的尺寸,否则显示异常。尺寸安装内部容器的尺寸 6 listw.addItem(item) # 添加到列表控件中 7 listw.setItemWidget(item, item_content_widget)# 把列组件和自定义的关联起来。 8 # 读取内容 9 for i in range(listw.count()): # 仅展示一种 10 item = listw.item(i) # 这样就拿到了item 如果关联了自定义widget 11 item_content_widget = listw.itemWidget(item) # 这样才可以拿到
QsciScintilla 代码编辑器需要额外安装Qsci库
1 class ScriptViewer(QsciScintilla): 2 """""" 3 def __init__(self, basename, parent=None): 4 """""" 5 QsciScintilla.__init__(self, parent) 6 # 以\n换行 7 self.setEolMode(self.SC_EOL_LF) 8 # 自动换行。self.WrapWord是父类QsciScintilla的 9 self.setWrapMode(self.WrapWord) 10 # 自动补全。对于所有Ascii字符 11 self.setAutoCompletionSource(self.AcsAll) 12 # 自动补全大小写敏感 13 self.setAutoCompletionCaseSensitivity(False) 14 # 输入多少个字符才弹出补全提示 15 self.setAutoCompletionThreshold(1) 16 # 代码可折叠 17 self.setFolding(True) 18 # 设置默认字体 19 self.setFont(QFont('Courier New', 12)) 20 # 0~4。第0个左边栏显示行号 21 self.setMarginType(0, self.NumberMargin) 22 # 设置空白 23 # self.setMarginLineNumbers(0, True) 24 # 边栏背景颜色 25 self.setMarginsBackgroundColor(QColor(120, 220, 180)) 26 # 边栏宽度 27 self.setMarginWidth(0, 30) 28 # 换行后自动缩进 29 self.setAutoIndent(True) 30 # tab宽度是4 31 self.setTabWidth(4) 32 # 支持中文字符 33 self.setUtf8(True) 34 # 显示空格点和\t的箭头 35 self.setWhitespaceVisibility(True) 36 # 设置空格的宽度 37 self.setWhitespaceSize(2) 38 # 设置用空格代替tab 39 self.setIndentationsUseTabs(False) 40 def setPythonScriptLexer(self): 41 """Python脚本语法高亮""" 42 self.mTextLexer = QsciLexerPython() 43 self.setLexer(self.mTextLexer) 44 def setTextLexer(self): 45 """""" 46 self.mTextLexer = QsciLexerTeX() 47 self.setLexer(self.mTextLexer) 48 def setCssLexer(self): 49 """CSS样式高亮""" 50 self.mTextLexer = QsciLexerCSS() 51 self.setLexer(self.mTextLexer) 52 def setConfigLexer(self): 53 """properties文件样式高亮""" 54 self.mTextLexer = QsciLexerProperties() 55 self.setLexer(self.mTextLexer)
QTabWidget Tab组件
1 tab = QTabWidget() 2 tab.addTab(widget, "标题") # 有多个参数,支持显示图标
QDockWidget 窗口Dock
1 dock_widget = QDockWidget("标题", parent) 2 dock_widget.setFeatures(QDockWidget.DockWidgetMovable) # 可以拖动,其他功能看doc 3 dock_widget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) # 设置停靠的区域。这里是主窗口左右两边 4 dock_widget.setWidget(widget) # 把widget放入dock内部 5 self.addDockWidget(Qt.RightDockWidgetArea, dock_widget) 6 # 将dock窗口添加到主窗口中,这里的self用的QMainWindow。给他默认停靠位置
ToolBar工具栏
1 toolbar = self.addToolBar("标题") 2 toolbar.addAction(QAction) #增加按钮QAction
QMenuBar 菜单栏
1 memubar = QMenuBar(self) # self=主窗体,QMainWindow 2 menuItem = menubar.addMenu("File") # 增加一个主菜单 3 menuItem.addAction(QAction) # 增加子菜单 4 menuItem.addSeperator() # 增加一个分割线 5 menuItem.setShortcut("Ctrl+N") # 设置快捷键 6 child_item = menuItem.addMenu("xx") # 增加子菜单
QAction 动作(放在菜单和工具栏上面)
1 action = QAction("名字", self) #self=主窗体,QMainWindow 2 action = QAction(QIcon(), "名字", self) # 可以显示图标 3 action.triggered.connect(callable) # 点击事件 4 action.setShortcut("Ctrl + Q") # 设置快捷键 5 action.setCheckable(True) # 设置为选择菜单 6 action.setChecked(False) # 是否默认选择
QTextEdit 文本编辑框
1 text = QTextEdit() 2 text.setText("str") # 设置文本 3 cursor = text.textCursor() # 获取光标的位置,这样可以选择,修改颜色,指定地方插入文本等 4 cursor.movePosition(QTextCursor.End) #移动光标位置 -末尾 5 cursor.insertText("str") # 插入文本 6 text.setTextCursor(cursor) 7 text.ensureCursorVisible()
QSystemTrayIcon 系统托盘图标
1 class QSysTrayIcon(QSystemTrayIcon): 2 """ 系统托盘图标功能 """ 3 def __init__(self, parent=None): 4 super(QSysTrayIcon, self).__init__(parent) 5 # 系统菜单 6 self.mContextMenu = QMenu() 7 # 设置系统菜单 8 self.setContextMenu(self.mContextMenu) 9 # 托盘的图标 10 self.setIcon(QIcon("capture.png")) 11 def send_message(self, title, content, icon_=0, delay_=10000): 12 """ 13 显示一条消息通知 14 :param title: 15 :param content: 16 :param icon_: (0没有图标 1信息图标 2警告图标 3错误图标),0还是有一个小图标 17 :param delay_: 持续间隔(毫秒) 18 :return: 19 """ 20 self.showMessage(title, content, icon=icon_, msecs=delay_) 21 def add_menu_action(self, label_, parent_, triggered_): 22 """ 23 添加操作按钮 24 :param label_: 25 :param parent_: 26 :param triggered_: 27 :return: 28 """ 29 action = QAction(label_, parent_, triggered=triggered_) 30 self.mContextMenu.addAction(action) 31 return action 32 def quit(self): 33 """ 34 退出 35 :return: 36 """ 37 self.setVisible(False) 38 ## 使用 39 mTrayIcon = QSysTrayIcon(self) # self=主窗体,QMainWindow 40 mToggleAction = mTrayIcon.add_menu_action("隐藏界面", self, self.on_toggle_widget) 41 mTrayIcon.show() 42 # 在主窗体的closeEvent中调用self.mTrayIcon.quit()来保证icon消失 43 # 发送一个气泡消息,可以做icon和显示的时长 44 mTrayIcon.send_message("提示", "界面已经显示")
QSplashScreen 启动画面
这是官方提供的一种,也可以自己用QWidget搞
1 class SplashScreen(QSplashScreen): 2 def set_image_data(self, image, w, h): 3 """设置启动图数据""" 4 # 缩放图片和设置画面尺寸 5 self.setMaximumSize(w, h) 6 image = image.scaled(w, h, Qt.KeepAspectRatio) 7 self.setPixmap(image) # 这个就是设置启动画面图 8 def effect_fade_in(self, timeout=1.0, addv=0.02): 9 """ 淡入 """ 10 self.setWindowOpacity(0) 11 loop_count = int(1 / addv) 12 sleep_time = timeout / loop_count 13 for i in range(loop_count): 14 new_opacity = self.windowOpacity() + 0.02 # 设置淡入 15 if new_opacity > 1: 16 break 17 self.setWindowOpacity(new_opacity) 18 time.sleep(sleep_time) 19 def effect_fade_out(self, timeout=0.5, addv=0.02): 20 """ 淡出 """ 21 self.setWindowOpacity(1) 22 loop_count = int(1 / addv) 23 sleep_time = timeout / loop_count 24 for i in range(loop_count): 25 new_opacity = self.windowOpacity() - 0.02 # 设置淡出 26 if new_opacity < 0: 27 break 28 self.setWindowOpacity(new_opacity) 29 time.sleep(sleep_time) 30 def on_show_effect(self): 31 """ 开始显示的效果 """ 32 self.setWindowOpacity(0) 33 self.show() 34 self.effect_fade_in() 35 def on_hide_effect(self): 36 """ 结束显示的效果 """ 37 self.effect_fade_out() 38 def mousePressEvent(self, evt): 39 """重写鼠标点击事件,阻止点击后消失""" 40 pass 41 def mouseDoubleClickEvent(self, *args, **kwargs): 42 """重写鼠标移动事件,阻止出现卡顿现象""" 43 pass 44 def enterEvent(self, *args, **kwargs): 45 """重写鼠标移动事件,阻止出现卡顿现象""" 46 pass 47 def mouseMoveEvent(self, *args, **kwargs): 48 """重写鼠标移动事件,阻止出现卡顿现象""" 49 pass 50 # 样例,正常的流程可以自己随便接 51 app = QApplication(argv) 52 app.processEvents() # 让事件继续派发 53 sp = SplashScreen() # 动画没有试过,需要 54 sp.on_show_effect() 55 <some main widiget init > # 可以在这里初始化主界面 56 sp.on_hide_effect() 57 sp.finish(some widget) # 这样启动画面会等待这个widget显示后才会消失。 58 sp.deleteLater() 59 # 下面是网上的显示gif动画的代码 60 class GifSplashScreen(QSplashScreen): 61 def __init__(self, *args, **kwargs): 62 super(GifSplashScreen, self).__init__(*args, **kwargs) 63 self.movie = QMovie('some.gif') 64 self.movie.frameChanged.connect(self.onFrameChanged) 65 self.movie.start() 66 def onFrameChanged(self, _): 67 self.setPixmap(self.movie.currentPixmap()) 68 def finish(self, widget): 69 self.movie.stop() 70 super(GifSplashScreen, self).finish(widget)
QMovie 显示动画
1 # 在界面显示gif动画,需要用到QMovie和QLabel 2 label = QLabel() 3 movie = QMovie("gif") 4 movie.setScaledSize(QSize()) # 设置缩放尺寸 5 movie.setCacheMode(QMovie.CacheAll) # 缓存 6 movie.setSpeed(100) # 设置速度 7 label.setMovie(movie) # 设置动画 8 label.setScaledContents(True) #按内容缩放 9 movie.start() # 开始播放
文章来自我的公众号,大家如果有兴趣可以关注,具体扫描关注下图。