0
点赞
收藏
分享

微信扫一扫

PyQt5自学笔记整理 Ch2

年夜雪 2022-02-20 阅读 53

信号(signal)和槽(slot)

信号与槽是PyQt的核心机制。

信号是由对象或控件发射出去的消息

槽是指拦截这些发射出去的信号的代码,槽本质上是一个函数或者方法

以【按钮的单击事件】为例,当单击按钮时,按钮就会向外部发送单击的消息,这些消息就会被槽拦截

信号可以理解为事件,槽可以理解为事件函数

我们需要将信号和槽绑定,可以是一对一,一对多,多对一。

对于单个控件

比如我们想设定单击某个按钮直接关闭窗口。

点击左上角Edit-编辑信号/槽,按住你想要赋予此功能的控件并拉出来

 可以看到如下界面

左侧为信号,右侧为槽

选中左侧click(),右侧close(),点击ok,可以看到如下情况,代表绑定成功

 点击预览,测试效果。

对于多个控件

比如我们要控制一个文本输入框的显示和隐藏

 由于我们设定默认是显示,需要设定属性编辑器中的checked,如图

【默认是不打勾的】 

 开启编辑信号/槽,选中我们要释放信号的控件,按住并拉到我们想要控制的控件上,如图所示

之后选择信号和槽

设置菜单栏和工具栏

首先,需要你的窗口是Main Window类型的

 创建后如图

 左上角的【在这里输入】处这一行即为菜单栏,双击可以重命名

重命名后可以继续添加

 比如我这里在子菜单创建了一个new

 在动作编辑器里即可看到所创建的动作【如果没有可以看左上角视图内的动作编辑器是否打开】

 双击动作后可以编辑

 【文本:在窗口内显示的名称】

【对象名称:在此动作的代码中创建的对象的名称】

【tooltip:自己可见的提示】

【checkable:是否可用】

【shortcut:设置快捷键】

        创建工具栏

右键窗口空白处,选择“添加工具栏”

菜单栏下面一行即为工具栏

 可以把动作编辑器中的动作拖到工具栏中,如图

 【不要直接从菜单栏中拖,这样菜单栏中的会直接移动到工具栏而不会保留,相当于移动,而从动作编辑器中拖动相当于复制】

主窗口类型

一共有三种窗口类型:QMainWindow,QWidget和QDialog

QMainWindow:可以包含菜单栏、工具栏、标题栏和状态栏,是最常见的窗口形式

QDialog:是对话窗口的基类,没有菜单栏、工具栏、状态栏

QWidget:不确定窗口的用途,就用这个

用代码编写第一个窗口

import sys
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtGui import QIcon

class FirstMainWin(QMainWindow):
    def __init__(self,parent=None):
        super(FirstMainWin,self).__init__(parent)

        #设置主窗口的标题
        self.setWindowTitle('第一个主窗口应用')

        #设置窗口的尺寸
        self.resize(400,300)
        
        #创建状态栏对象
        self.status = self.statusBar()

        #设置状态栏信息及存在时间
        self.status.showMessage('只存在五秒的消息',5000)

if __name__ =='__main__':
    app=QApplication(sys.argv)

    #project目录下的一个图片,在这里充当图标,格式可以是ico,jpg等
    app.setWindowIcon(QIcon('./pictures/1.jpg'))
    
    main = FirstMainWin()
    main.show()

    sys.exit(app.exec_())

得到窗口如下

 让主窗口居中

需要添加一个center函数再调用

import sys
from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication #多了QDesktopWidget
from PyQt5.QtGui import QIcon

class CenterForm(QMainWindow):
    def __init__(self):
        super(CenterForm,self).__init__()

        # 设置主窗口的标题
        self.setWindowTitle('让窗口居中')

        # 设置窗口的尺寸
        self.resize(400,300)

    def center(self):  # 定义一个函数使得窗口居中显示

        # 获取屏幕坐标系
        screen = QDesktopWidget().screenGeometry()

        # 获取窗口坐标系
        size = self.geometry()

        #(屏幕宽度-窗口宽度)/2 得到窗口居中时的横坐标
        newLeft = (screen.width() - size.width()) / 2 
 
        #(屏幕高度-窗口高度)/2 得到窗口居中时的纵坐标  
        newTop = (screen.height() - size.height()) / 2
        
        #移动
        self.move(int(newLeft),int(newTop))



if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = CenterForm()
    main.center()  #调用center函数
    main.show()
    sys.exit(app.exec_())

退出应用程序

import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QHBoxLayout,QWidget,QPushButton
from PyQt5.QtGui import QIcon

class QuitApplication(QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(700, 400)
        self.setWindowTitle('退出应用程序')

        #添加Button
        self.button1 =QPushButton('退出应用程序')

        #将信号与槽关联
        self.button1.clicked.connect(self.onClick_Button)

        layout = QHBoxLayout()
        layout.addWidget(self.button1)

        mainFrame = QWidget()
        mainFrame.setLayout(layout)

        self.setCentralWidget(mainFrame)


    #按钮单击事件的方法【相当于自定义的一个槽】
    def onClick_Button(self):
        sender = self.sender()
        print(sender.text() + '按钮被按下')
        app=QApplication.instance()
        #退出应用程序
        app.quit()

if __name__ =='__main__':
    app=QApplication(sys.argv)

    app.setWindowIcon(QIcon('./pictures/1.jpg'))
    main = QuitApplication()
    main.show()
    sys.exit(app.exec_())
举报

相关推荐

0 条评论