zoukankan      html  css  js  c++  java
  • GUI学习之九——QToolButton的学习总结

    QToolButton提供一个快速的访问按钮,通常在工具栏内使用,一般不显示文本标签而显示图标。

    一.按钮的样式风格设置

    可以按照下面的风格对按钮进行样式设置

    从左到右依次是仅显示图标、仅显示文字、图标在文本左侧和文字在图标下侧。代码是这样的

    btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)  #设置样式
    btn.toolButtonStyle()                               #获取样式
    #下面是样式设置的枚举值
    Qt.ToolButtonIconOnly       #仅显示图标 ,返回值0
    Qt.ToolButtonTextOnly       #仅显示文本,返回值1
    Qt.ToolButtonTextBesideIcon #文本显示在图标旁边,返回值2
    Qt.ToolButtonTextUnderIcon  #文本显示在图标下面,返回值3
    Qt.ToolButtonFollowStyle    #遵循风格,返回值4

    二. 箭头样式

    好多可以扩展的工具栏按钮是有扩展的箭头的,上面图上就是显示了Word带箭头的工具栏按钮。我们可以设置它的样式

    btn.setArrowType(Qt.RightArrow)
    print(btn.arrowType())
    
    Qt.NoArrow             #无箭头,返回值0
    Qt.UpArrow             #向上箭头,返回值1
    Qt.DownArrow           #向下箭头,返回值2
    Qt.LeftArrow           #向左箭头,返回值3
    Qt.RightArrow          #向右箭头,返回值4      

    这里要清楚一点:箭头的优先级是高于图标的,就是说设置了箭头图标就不显示了(就目前的水平而言),但是如果样式风格设置为只显示文本箭头也是不显示的。

    四.自动提升

    工具栏按钮的自动提升和QPushButton的扁平化是一样的视觉效果,区别就是设置后当鼠标指向按钮时外观会发生变化,而扁平化只有点击后才变化。(扁平化是QPushButton类里的功能,QToolButton是没有的。)

    btn.setAutoRaise(True)   #设置自动提升    
    btn.autoRaise()          #获取是否设置了自动提升

    所以设置了autoraise后的按钮外观有三种效果:常规效果、鼠标指向时的效果和鼠标按下时的效果(图中从左到右)。

     五.菜单应用

    我们先做一个最简单的目录,并连接在工具栏按钮上

    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    
    btn = QToolButton(window)
    btn.setText('menu')
    
    menu = QMenu()
    
    action_1 = QAction(menu)
    action_1.setText('1')
    action_2 = QAction(menu)
    action_2.setText('2')
    menu.addAction(action_1)
    menu.addAction(action_2)
    btn.setMenu(menu)
    
    
    window.show()
    sys.exit(app.exec_())
    工具栏菜单

    运行后发现点击按钮菜单是不会弹出的,因为QPushButton的setmenu和QToolButton里的setmenu是不一样的。只有鼠标按下按钮并保持按下一段时间菜单才会弹出。就像浏览器的后退按钮,按下保持后会弹出一个菜单

    在后退按钮上是有鼠标点击的,但截图时候鼠标无法截取。

    btn.setPopupMode(QToolButton.MenuButtonPopup)  #设置菜单弹出模式
    btn.popupMode()                                #获取菜单弹出模式
    #菜单弹出模式枚举值
    QToolButton.DelayedPopup   #延时弹出菜单,返回值0
    QToolButton.MenuButtonPopup#鼠标按下箭头时弹出,返回值1
    QToolButton.InstantPopup   #鼠标按下按钮时弹出,返回值2

     这里要注意一点:菜单的弹出有时候会影响到信号的发射

    btn.clicked.connect(lambda :print('按钮被按下'))

    我们在这里加个信号和槽。

    运行后会发现当菜单弹出时槽函数是不会运行的。

    六.信号

    除了继承父类的信号外,QToolButton最常用的信号是

    QToolButton.triggered()

    这个triggered()和QAction类里的triggered()是不同的。他是可以传递一个Qaction作为参数的。

    def btn_call(action):
        print(action)
    btn.triggered.connect(btn_call)

    可以把上面的代码加工具栏菜单的案例中,运行一下看一看效果。

    鉴于上面所说的方式,可以有个小用法:

    当需要调用菜单里各个action时,原先的方式是对每个action进行定义,比方这样(假设菜单里有action1和action2,每次点击就打印"action1(2) is called",原先的方法是这样的

    action_1.triggered.connect(lambda :print('action1 is called'))
    action_2.triggered.connect(lambda :print('action2 is called'))

    但是如果菜单里的行为比较多,需要一个个写,比较麻烦可以用QAction里的setdata()来绑定数据后直接获取数据就可以

    import sys
    from PyQt5.Qt import *
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(800,600)
    
    btn = QToolButton(window)
    btn.setText('menu')
    
    btn.clicked.connect(lambda :print('按钮被按下'))
    menu = QMenu()
    
    action_1 = QAction(menu)
    action_1.setText('action1')
    
    action_2 = QAction(menu)
    action_2.setText('action2')
    action_1.setData('action1 is called')   #action_1绑定数据
    action_2.setData('action2 is called')   #action_2绑定数据
    
    menu.addAction(action_1)
    
    menu.addAction(action_2)
    btn.setMenu(menu)
    
    def btn_call(action):
        print(action.data())  #获取action里的数据
    
    btn.triggered.connect(btn_call)
    window.show()
    sys.exit(app.exec_())
    trigged信号用法

    这样就不用每个对信号进行绑定了。

  • 相关阅读:
    CAP.dll of dotnetcore
    GRPC 高性能 RPC 框架, 服务间通讯
    REST Client
    ERP Export
    ERP Update DataSource
    knockout js
    面试题目总结
    JavaScript Objiects and Prototypes
    PLS-00172: string literal too long
    字符串连接性能
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/10759559.html
Copyright © 2011-2022 走看看