【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() # 开始播放

    文章来自我的公众号,大家如果有兴趣可以关注,具体扫描关注下图。

posted @ 2021-08-19 11:50  爆走de萝卜  阅读(489)  评论(0编辑  收藏  举报