信号(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_())