0
点赞
收藏
分享

微信扫一扫

PyQt5自学 Day5

jjt二向箔 2022-05-03 阅读 40

设置按钮点击有效区域。重写hitButton(QPoint)方法,该方法有一个返回值bool。可以通过QPoint的x和y值来设置有效区域。方法里返回值为True才表示点击有效。如果要限制点击区域为一个圆,可以判断(x,y)到该圆心的距离。

class MyPushButton(QPushButton) :
    def hitButton(self, point) : #重写hitButton方法,传进去的point参数是QPoint类型
        if point.x() < 20 : #对point调用x()方法,可以获取其相对于该button左上角原点的x值
            return True #返回值为True,代表点击有效,会执行槽函数lambda :print("xxx")
        else :
            return  False #返回值为False,代表点击无效,不会执行槽函数lambda :print("xxx")
app = QApplication(sys.argv)

window = QWidget()

btn = MyPushButton(window)

btn.clicked.connect(lambda :print("xxx"))

信号。 pressed(),鼠标按下信号;released(),鼠标在控件内释放,或鼠标移除控件范围;clicked(),控件内按下+控件内释放,可以往槽函数传递一个参数,这个参数为True表示按钮被选中,False表示未被选中;toggled(),切换信号,一般用在单选框和复选框里,也就是单选框从选中变为非选中,或非选中变为选中,都会触发这个信号,可以往槽函数传递一个参数,这个参数为True表示按钮被选中,False表示未被选中。

QPushButton()。用来给用户点击。创建方法。常用:QPushButton(),QPushButton(parent);另外:QPushButton(text,parent可选),可以在创建时就加上显示文本,QPushButton(icon,text,parent可选),可以在创建时就加上图标和显示文本。

菜单设置。setMenu(QMenu)设置菜单,需要传入一个QMenu类型的参数,menu()获取菜单,showMenu()展示菜单(似乎不常用)。可以设置点击按钮弹出菜单供用户选择。如何去设置一个QMenu呢?QMenu类方法,addMenu(QMenu),添加子菜单(子菜单指点击这个菜单项会弹出下一级菜单);addAction(QAction),添加动作(比如点击这个菜单项会让你打开一个文件);addSperator(),添加分割线。此外QMenu可以通过setTitle(str)和setIcon(QIcon)来设置标题(也就是菜单项的名字)和图标,QAction可以通过setText(str)和setIcon(QIcon)来设置显示文本和图标。动作是要连接一个具体的操作的,所以QAction里有一个信号triggered,可以连接一个槽函数来执行具体的操作。

#创建一个QMenu类型的菜单对象
menu_set=QMenu()
#创建一个子菜单,并为其设置标题和父对象
menu_set_chi = QMenu(menu_set)
menu_set_chi.setTitle("111")

#创建一个QAction类型的动作对象,并为它设置显示内容,父对象和连接槽函数
action_1 = QAction(menu_set)
action_1.setText("1")
action_1.triggered.connect(test)

#一种更加简洁的创建动作对象的方法,直接把Icon,text和parent一次设置好
action_2 = QAction(QIcon(),"123",menu_set)

#将两个action添加到菜单对象中。注意虽然action_2设置时写了父对象,但还是要添加一遍
menu_set.addAction(action_1)
#在两个action之间设置分割线,那么就要把添加分割线的语句写在添加两个action的语句之间
menu_set.addSeperator
menu_set.addAction(action_2)
#在action_2之下添加子菜单,那么就要把添加子菜单的语句写在添加action_2的语句之下
menu_set.addMenu(menu_set_chi)

#你要如何排布这个菜单,就要如何排布这些添加语句

#将菜单对象添加到btn上
btn.setMenu(menu_set)

扁平化。setFlat(bool),isFlat()。

添加默认按钮。比如有几个按钮,如果你把其中一个设置为默认按钮,那么用户打开这个界面,这个按钮就会默认选中,让用户优先来点击这个按钮。按钮.setAutoDefault(bool),用户点击这个按钮以后,这个按钮就会默认选中;按钮.setDefault(),一开始这个按钮就会设为默认选中,不需要用户点击。

右键菜单。在窗口任意位置右键,会在右键出弹出一个菜单。菜单的创建参照前面。鼠标右键会触发一个事件,contextMenuEvent,如果想要修改这个事件,就要创建一个子类并覆写这个方法。

import sys
from PyQt5.Qt import *

#创建子类来覆写contextMenuEvent方法
class MyWindow(QWidget) :
    #在控件里右键,就会触发这个事件方法  
    def contextMenuEvent(self, evt) : #evt代表鼠标右击事件

        #创建一个菜单对象,这个对象是显示在window里的,所以父类是self。由于我们不再是单击某个按钮来显示菜单,所以这个菜单不需要被setMenu到某个按钮,它自身就是一个对象,可以被展示。
        menu_set = QMenu(self)

        action_1 = QAction()
        action_1.setText("1")

        menu_set.addAction(action_1)
        #QMenu也有exec_()这个方法,可以让菜单显示,里面可以传一个QPoint,表示菜单显示在哪。这里传入了evt.globalPos(),代表的是鼠标右键的全局坐标。
        #传入相对于屏幕右上角的全局坐标,才能让鼠标右键点哪,菜单就出现在哪。因为exec_()这个方法,会把传入的QPoint作为相对于屏幕原点的位置,来让菜单显示,比如传入QPoint(100,100),是显示在相对于屏幕左上角100 100处
        menu_set.exec_(evt.globalPos())

app = QApplication(sys.argv)

window = MyWindow()
window.resize(500,500)

window.show()

sys.exit(app.exec_())

右键菜单还有一种方法。

import sys
from PyQt5.Qt import *

app = QApplication(sys.argv)

window = QWidget()
window.resize(500,500)

#槽函数的功能就是展示菜单,也可以写别的内容
def show_menu(point) :
    menu_set = QMenu(window) #菜单的父控件是window

    action_1 = QAction()
    action_1.setText("1")

    menu_set.addAction(action_1)
    #将右键单击时相对于控件左上角原点的坐标转换为相对于屏幕左上角原点的坐标,对控件调用一个映射方法mapToGlobal(QPoint),返回值也是一个QPoint
    point = window.mapToGlobal(point)
    menu_set.exec_(point)

#这个可以设置控件右击以后的显示策略,Qt.CustomContextMenu这个参数传进去以后,就会触发下面customContextMenuRequested这个信号。
window.setContextMenuPolicy(Qt.CustomContextMenu)
#将右键信号与槽函数连接,这个信号会把一个QPoint传给槽函数,内容是右键单击时相对于控件左上角原点的坐标。
window.customContextMenuRequested.connect(show_menu)

window.show()

sys.exit(app.exec_())

QCommandLinkButton()。继承自QPushButton()。创建btn = QCommandLinkButton("标题","描述",parent),整体和PushButton类似,不过它可以多一个描述。也可以用setDescription来添加描述。

QToolButton()。和QPushButton一样,都是继承自AbstractButton。它可以提供一个快速访问按钮,通常用在工具栏。通常不显示文本,只显示图标。既有文本也有图标时一般只显示图标。以下就是工具栏示例。

设置提示信息。setToolTip(str),鼠标放在上面,就会显示提示信息。和QWidget里的鼠标悬停显示差不多。

设置风格。setToolButtonStyle(Qt.),传入各种风格,比如Qt.ToolButtonIconOnly,只显示图标的风格。设置箭头,就是可以把按钮图标设置成一个箭头,setArrowType(Qt.),传入各种样式的箭头。

设置自动提升。效果就是,你把鼠标放到这个工具按钮上,它就会自动凸起,这样一个效果。setAutoRaise(bool)。

toolbutton也可以添加菜单,方法。往一个btn里添加一个菜单,用btn.setMenu(QMenu)。创建QMenu时,最好为其指定好父对象。toolButton和pushButton设置菜单有一个区别就是,toolbutton设置菜单要指定弹出模式,setPopupMode(Qt.)。为什么有这种区别呢。对于一个普通的按钮,假如给它设置了菜单,那么它的功能基本就是点击它,然后弹出菜单。但对于工具按钮来说,一般它都会有一个功能,简单点击它会实现这个功能,所以它的弹出菜单不能是简单的点击,而是别的弹出风格,比如长按它等等

toolbutton的信号。triggered(QAction)。这个主要就是toolbutton绑定了一个菜单,菜单里有一个QAction,那么点击这个QAction,会触发toolbutton通过triggered连接的槽函数。该信号会把一个QAction传递给槽函数。我们在定义QAction时,可以给其setData(),里面可以传入任意类型数据,那么在槽函数里,我们就可以通过QAction.data(),来拿到我们传进去的东西。

btn = QToolButton(window) #创建一个toolbutton
btn.setText("111")

menu = QMenu() #创建一个QMenu

action = QAction("123") #创建一个QAction
action.setData([1,2]) #为QAction添加数据
menu.addAction(action) #将action添加到menu

def test(action) : #triggered信号会把QAction传递给槽函数
    print(action.data()) #获取QAction的data

btn.setMenu(menu)
btn.triggered.connect(test) #点击哪个action,就会把哪个action对应的QAction传递给槽函数

QRadioButton()。和QPushButton一样,都是继承自AbstractButton。单选框,一般就是在多个按钮里让用户只选择一个。一个父控件里,假如只有一个radiobutton,那么选中它之后,再点它可以取消选中;而有多个radiobutton,选中一个按钮以后,点击它不能取消选中,选中另一个,之前选中的图标就会自动取消选中,排他性,可以通过设置排他性来改变这种特性。radiobutton是自带排他性的。创建方法类似pushbutton,但是不能在创建时设置图标(可以设置文本)。场景,男 女两个图标,打开窗口以后,让男默认选中,那么就可以在男图标之后setChecked(True)。设置快捷键和AbstracButton方法一样。

常用信号就是toggled。假如选中状态发生了切换,就会触发。比如给女按钮连接了槽函数,它本来是选中状态,男按钮是非选中,这时我们点击男按钮,那么女按钮会自动切换为非选中状态,那么就会触发槽函数。

多组互斥问题。比如同一个父控件下有男/女,是/不是四个按钮,我们希望男/女一组,是/不是一组,男/女之间有排他性,是/不是之间有排他性,但是实际情况会是这四个按钮只能选中一个。一种方法是创建两个父控件,男/女用一个,是/不是用一个。这种方法比较麻烦,更加方便的方法是使用QButtonGroup()。

QButtonGroup()。提供一个抽象的按钮容器,可以将多个按钮划分为一组,不具备可视化的效果。直接继承自QObject()。setButtonGroup(),创建;addButtonGroup(QAbstractButton),将按钮添加到这个group中。

btn_1 = QRadioButton(window)
btn_1.move(100,100)
btn_1.setText("111")
btn_2 = QRadioButton(window)
btn_2.move(200,100)
btn_2.setText("222")
group_12 = QButtonGroup(window) #创建buttongroup
group_12.addButton(btn_1) #将按钮添加到group中
group_12.addButton(btn_2)

btn_3 = QRadioButton(window)
btn_3.move(100,200)
btn_3.setText("333")
btn_4 = QRadioButton(window)
btn_4.move(200,200)
btn_4.setText("444")
group_34 = QButtonGroup(window)
group_34.addButton(btn_3)
group_34.addButton(btn_4)

#我们实际在window中看不到这两个组,它们是一个抽象的关系

buttons(),可以返回一个组里所有的按钮。addButtonGroup(QAbstractButton,id),可以在添加按钮是为按钮设置一个类型为int的id,比如addButtonGroup(btn,2)。然后我们可以使用button(int)方法,传入id,来获取特定按钮。checkedButton(),可以返回当前选中的按钮。

移除按钮。从组里移出这个按钮,removeButton(QAbstractButton)。

除了在addButtonGroup(QAbstractButton,id)可以为组里的某个按钮设置id,也可以使用setId(QAbstractButton,id)来给组里的某个按钮设置id,使用方法是group.setId(QAbstractButton,id)。id(QAbstractButton)可获取组里指定按钮的id。checkedId()可获取组里选中的按钮的id,若不存在,返回-1。

可以给组设置互斥或不互斥。group.setExclusive(bool),如果传入True,那么这个组里的元素就有排他性,False就没有。

QButtonGroup()里的信号。buttonClicked,buttonPressed,buttonReleased,buttonToggled,组里只要有一个按钮clicked,pressed,released,toggled,就会触发这个信号,给槽函数会传一个参数,参数类型是int(代表clicked,pressed,released,toggled的按钮的id),或是QAbstractButton(代表clicked,pressed,released,toggled的按钮)。那么怎么选择传给槽函数的是哪种参数呢?可以这么写buttonpressed[int].connect(),这样就会传过去int类型的参数。

QCheckBox()。复选框,可以多选,可以单选,可以不选。继承自AbstractButton。特性和单选框基本类似,但是默认没有排他性。

QCheckBox()有一个独有特性就是三态。它可以被设置为存在三种状态(默认是两种),未被选中,部分被选中和真的被选中。setTristate(bool),传入True,就可以让复选框开启三态。开启三态以后,通过setCheckState(Qt.),可以给复选框设置为三态里的一种,传入的参数即是三种状态的一种。

QCheckBox()特有的信号,stateChanged(int),选中或清除选中时,发射此信号。注意和toggled的区别,普通的按钮只有选中/非选中两种状态,这就用toggled;但是如果复选框设置了三态,那就要用stateChanged(int),只有选中或清除选中时,发射此信号。

输入控件。用来采集用户输入的信息。第一种最常用的就是纯键盘文本输入,QLineEdit()。允许用户输入和编辑单行纯文本。继承自QWidget。

QLineEdit()的创建,可以在创建时传入text和parent。

文本的设置和获取。setText(str),这个方法和button的setText是不一样的,这样就可以在文本框里设置一个展示信息;text(),获取文本框里所有的文本信息,包括用户输入的;insert(str),在光标闪烁处插入文本;displayText(),获取用户能看到的内容文本,比如用户输入了密码,那么在显示界面用户看到的会是一连串***,用text()能获取用户真实输入的密码,而displayText()获取到的就是一连串***。

 

举报

相关推荐

pyQT5

linux pyqt5

PYQT5 001

PyQt5自学笔记整理 Ch2

【PYQT5】retranslateUi()

Leetcode day5

0 条评论