目录
主窗口类型(3种):
让主窗口居中
退出应用程序
屏幕坐标系
设置窗口和应用程序图标
控件提示信息
从本篇开始,就不再以designer为主来来进行学习了,而是转向纯py代码来实现程序的构建。
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtGui import QIcon #图标
class FirstMainWin(QMainWindow):
#self指针指向该类创建的实例对象
#parent指代实体的窗口对象,也就是主函数里面那个mainWindow=QMainWindow()
#两个__init__(parent)中的parent加不加都无所谓
#init不要写成int!!!!!!!!!!!
def __init__(self,parent=None):
#调用父类初始化函数
super(FirstMainWin, self).__init__(parent)
#设置著窗口的标题
self.setWindowTitle('first mainWindow app')
#设置窗口的尺寸
self.resize(400,300)
#获得当前状态栏
self.status=self.statusBar()
self.status.showMessage('a message that only exsits 5s',5000)
print('初始化完毕!')
if __name__=='__main__':
app=QApplication(sys.argv)
#设置应用程序图标
app.setWindowIcon(QIcon('./icon/first.png'))
main=FirstMainWin()#__init__()创建对象时就自动调用了
main.show()
#进入程序主循环
sys.exit(app.exec_())
有bug,类里的初始化函数没执行,咋肥事???__init__写成__int__了,可恶。
运行结果:
窗口的位置是根据左上角的坐标来确定的,在pyqt5中并没有直接的API使窗口居中,所以要自己写一个类。
代码中已说的足够。
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QDesktopWidget
class FirstMainWin(QMainWindow):
#parent指代实体的窗口对象,也就是主函数里面那个mainWindow=QMainWindow()
#两个__init__(parent)中的parent加不加都无所谓
def __init__(self,parent=None):
#调用父类初始化函数
super(FirstMainWin, self).__init__(parent)
#设置著窗口的标题
self.setWindowTitle('centralize')
#设置窗口的尺寸
self.resize(400,300)
#self.center()
def center(self):
# 获得屏幕坐标系
screen=QDesktopWidget().screenGeometry()
# 获得窗口坐标系
size=self.geometry()
'''
即(screen.width(),screen.height())是屏幕的右下角,可用来计算屏幕的分辨率
(size.width(),size.height())是窗口的宽和高,可计算窗口大小,故而不难理解下面的算法
'''
newLeft=(screen.width()-size.width())/2
newTop=(screen.height()-size.height())/2
self.move(newLeft,newTop)#窗口的新左上角坐标
if __name__=='__main__':
app=QApplication(sys.argv)
main=FirstMainWin()#__init__()创建对象时就自动调用了
main.center()#或者直接在init函数中加一句self.center()
main.show()
#进入程序主循环
sys.exit(app.exec_())
突然感觉有本书的重要性,,东西好零散。
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow,QWidget,QHBoxLayout,QPushButton
class QuitApplication(QMainWindow):
def __init__(self):
super(QuitApplication, self).__init__()
self.resize(400,300)
self.setWindowTitle('退出应用程序')
#添加Button
self.button1=QPushButton('退出应用程序')
#将信号与槽关联
self.button1.clicked.connect(self.onClick_Button)#注意括号里的参数不带括号
# 创建水平布局
layout=QHBoxLayout()
#将button1添加到水平布局
layout.addWidget(self.button1)
#QWidget上存放所有组件
'''
基础窗口控件QWiget类是所有用户界面对象的基类,所有的窗口和空间都是直接或者间接继承自QWiget类。QWidget继承自 QObject 和 PaintDevice 。
'''
mainFrame=QWidget()
#将水平布局放到主框架上
mainFrame.setLayout(layout)
#将主框架放到主窗口上
self.setCentralWidget(mainFrame)
#按钮单击事件(自定义的槽)
def onClick_Button(self):
# 接收按钮信号
sender=self.sender()
#sender.text()输出按钮的文本
print(sender.text()+'按钮被按下')
app=QApplication.instance()#返回APP实例
#退出应用程序
app.quit()
if __name__=='__main__':
app=QApplication(sys.argv)
main=QuitApplication()
main.show()
sys.exit(app.exec_())
运行结果:
点击”退出应用程序“窗口就关闭了。
先搞清楚窗口和工作区的区别
窗口就是上面那一整个,而工作区在苹果系统下就是标题栏下面那一块,但是在Windows下是红色区域那一块,故而win下工作区和窗口之间还是有边框的,所以苹果下和win的数据不太一样。
代码(看注释,简单易懂):
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
#面向过程
def onClick_Button():
print('1')
print('widget.x()=%d'%widget.x()) #窗口横坐标
print('widget.y()=%d' % widget.y()) #窗口纵坐标
print('widget.width()=%d' % widget.width()) #工作区宽度
print('widget.height()=%d' % widget.height()) #工作区高度
print('2')
print('widget.geometry().x()=%d' % widget.geometry().x()) #工作区横坐标
print('widget.geometry().y()=%d' % widget.geometry().y()) #工作区纵坐标
print('widget.geometry().width()=%d' % widget.geometry().width()) #工作区宽度
print('widget.geometry().height()=%d' % widget.geometry().height()) #工作区高度
print('3')
print('widget.frameGeometry().x()=%d' % widget.frameGeometry().x()) #窗口横坐标
print('widget.frameGeometry().y()=%d' % widget.frameGeometry().y()) #窗口纵坐标
print('widget.frameGeometry().width()=%d' % widget.frameGeometry().width()) #窗口宽度
print('widget.frameGeometry().height()=%d' % widget.frameGeometry().height()) #窗口高度
return
app=QApplication(sys.argv)
widget=QWidget()
btn=QPushButton(widget)
btn.setText('按钮')
btn.move(24,52)
#连接信号与槽
btn.clicked.connect(onClick_Button)
widget.resize(300,240) #设置工作区尺寸,不包括标题栏
widget.move(250,200)
widget.setWindowTitle('屏幕坐标系')
widget.show()
sys.exit(app.exec_())
运行结果:
1
widget.x()=250
widget.y()=200
widget.width()=300
widget.height()=240
2
widget.geometry().x()=259
widget.geometry().y()=238
widget.geometry().width()=300
widget.geometry().height()=240
3
widget.frameGeometry().x()=250
widget.frameGeometry().y()=200
widget.frameGeometry().width()=318
widget.frameGeometry().height()=287
首先,窗口图标是打开应用左上角的图标; 应用图标是桌面应用图标
窗口的setWindowIcon方法用于设置窗口的图标,只在Windows中可用,
QApplication中的setWindowIcon方法用于设置主窗口的图标和应用程序图标,
但调用了窗口的setWindowIcon方法,QApplication中的setWindowIcon方法就只能用于设置应用程序图标了(这样就可以分别设置应用和窗口图标了)。
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication,QMainWindow
class IconForm(QMainWindow):
def __init__(self):
super(IconForm, self).__init__();
self.initUI()
def initUI(self):
#设置窗口坐标系(位置,大小)
self.setGeometry(300,300,250,250);#x,y,w,h
#设置主窗口的标题
self.setWindowTitle('set window icon')
#设置窗口图标
self.setWindowIcon(QIcon('./icon/first.png'))
if __name__=='__main__':
app=QApplication(sys.argv)
#app.setWindowIcon(QIcon('./icon/first.png'))
main=IconForm()
main.show()
sys.exit(app.exec_())
就是鼠标停在那里,就会浮现出提示信息。
代码:
import sys
from PyQt5.QtWidgets import QApplication,QWidget,QMainWindow,QHBoxLayout,QPushButton,QToolTip #控件提示信息类
from PyQt5.QtGui import QFont #字体
class ToolTipForm(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif,12'))
#设置提示信息,是设置粗体
self.setToolTip('今天是星期一')
self.setGeometry(300,300,200,300)
self.setWindowTitle('tool_tip')
self.btn1=QPushButton('my button')
#设置按钮的提示信息
self.btn1.setToolTip('I am a button!')
layout=QHBoxLayout()
layout.addWidget(self.btn1)
mainFrame=QWidget()#此处若改为QMainWindow则不会显示控件!
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
if __name__=='__main__':
app=QApplication(sys.argv)
main=ToolTipForm()
main.show()
sys.exit(app.exec_())
运行结果: