PyQt5基础学习(三)——通过代码形式基本实现图形窗口
之前我们通过QTDesigner工具基本实现了一个窗口界面的制作流程,但是通过代码进行编写,主要是为了学习PyQt5的核心API的使用方法,只有学习代码,才能彻底完全了解PyQt5的API如何使用
1 主窗口(MainWindows)
1.1 主窗口类型
主要有3种:
QMainWindow:可以包含菜单栏、工具栏、状态栏和标题栏,是最常见的窗口形式。
QDialog:是对话窗口的基类,没有菜单栏、工具栏和状态栏,常用于短期使用。
QWidget:不确定窗口的用途,就使用,最不常用。
1.2 基本窗口的创建以及居中显示
自己创建center方法,其中利用窗口和屏幕坐标,通过move函数进行窗口的移动。
代码如下:
import sys
from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication
from PyQt5.QtGui import QIcon
# 创建窗口并居中显示
class Demo(QMainWindow):
def __init__(self):
super(Demo,self).__init__()
self.setWindowTitle("测试窗口")
self.resize(400,300)
self.center()
self.status = self.statusBar() #提供一个消息栏
self.status.showMessage("显示5秒",5000)
def center(self): # 居中函数
#获取屏幕坐标
screen = QDesktopWidget().screenGeometry()
# 获取窗口坐标系
size = self.geometry()
# 屏幕宽度-窗口宽度/2
# '//'表示整数除,'/'单表示除,本例中move需要整数类型,所以用//,或者自己强转。
newLeft = ((screen.width() - size.width()) // 2)
# (屏幕高度-窗口高度)/2
newTop = (int)((screen.height() - size.height()) / 2)
#移动窗口(x,y)
# x表示从左往右移动的距离,y表示从上往下移动的距离
# 即原本默认(0,0)时,窗口位于左上角且左上角正好对齐
self.move(newLeft, newTop)
leftlength = (screen.width() - size.width()) / 2
toplength = (screen.height() - size.height()) / 2
print(f"window.width():{size.width()},window.height():{size.height()}")
print(newLeft,newTop)
print(leftlength,toplength)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setWindowIcon(QIcon("./image/123.png")) # 标题图标
main = Demo()
main.show()
sys.exit(app.exec_()) # 退出图标主循环
1.3 关闭主窗口
import sys
from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QPushButton,QWidget
# 信号槽的代码实现
class Demo1(QMainWindow):
def __init__(self):
super(Demo1, self).__init__()
self.resize(300,120)
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是发送信号的对象
sender = self.sender()
print(sender.text()+'按钮被按下')
app = QApplication.instance()
#退出应用程序
app.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Demo1()
main.show()
sys.exit(app.exec_()) # 退出图标主循环
2 QWidget
2.1 窗口坐标区别
import sys
from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QPushButton,QWidget
def onClick_Button():
print("onclick")
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())
#创建实例
app = QApplication(sys.argv)
# 创建窗口
widget = QWidget()
btn = QPushButton(widget)
btn.setText("按钮")
btn.clicked.connect(onClick_Button)
btn.move(24,52)
widget.resize(300,240)
widget.move(250,200)
widget.setWindowTitle('屏幕坐标系')
widget.show()
sys.exit(app.exec_())
运行结果如下:
主要说明
widget.x或者.y表示的是标题栏的左上角的x,y坐标,width和height代表窗口宽高,
geometry()则代表客户区的x,y坐标,width和height原意思保持不变。
frameGeometry中x,y与widget都表示标题左上方,但是在width和height上则表示包括标题区、边框区。
2.2 设置气泡提示
import sys
from PyQt5.QtWidgets import QWidget,QToolTip,QApplication
from PyQt5.QtGui import QFont
# 设置气泡提醒
class Demo1(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('这是一个<b>气泡提示</b>')
self.setGeometry(200, 300, 400, 400)
self.setWindowTitle('气泡提示Demo')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Demo1()
win.show()
sys.exit(app.exec_())
3 QLabel标签
3.1 显示QLabel
from PyQt5.QtWidgets import QApplication, QToolTip, QLabel ,QWidget, QVBoxLayout
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QPalette, QIcon, QFont
import sys
class WindowDemo(QWidget):
def __init__(self):
super(WindowDemo, self).__init__()
label1 = QLabel(self)
label2 = QLabel(self)
label3 = QLabel(self)
label4 = QLabel(self)
# 初始化标签控件
label1.setText("这是一个文本标签")
label1.setAutoFillBackground(True)
palette = QPalette()
palette.setColor(QPalette.Window,Qt.blue)
label1.setPalette(palette)
label1.setAlignment(Qt.AlignCenter)
label2.setText("<A href='#'>欢迎使用Python GUI应用</a>")
label3.setAlignment(Qt.AlignCenter)
label3.setToolTip('这是一个图片标签')
label3.setPixmap(QPixmap("./1.jpg"))
label4.setText("<a href='http://www.baidu.com/'>欢迎百度</a>")
label4.setAlignment(Qt.AlignRight)
label4.setToolTip('这是一个超级链接标签')
# 2 在窗口布局中添加控件
vbox = QVBoxLayout()
vbox.addWidget(label1)
vbox.addStretch()
vbox.addWidget(label2)
vbox.addStretch()
vbox.addWidget(label3)
vbox.addStretch()
vbox.addWidget(label4)
# 3 允许label1控件访问超链接
label1.setOpenExternalLinks(True)
# 打开允许访问超链接,默认是不允许,
# 需要使用 setOpenExternalLinks(True)允许浏览器访问超链接
label4.setOpenExternalLinks(True)
label4.linkActivated.connect(link_clicked)
label2.linkHovered.connect(link_hovered)
label1.setTextInteractionFlags(Qt.TextSelectableByMouse)
self.setLayout(vbox)
self.setWindowTitle("QLabel例子")
def link_hovered():
print("当鼠标划过label-2标签时,触发事件。")
def link_clicked():
print("当用鼠标点击label1-4标签时,触发事件。")
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setWindowIcon(QIcon('./img.png'))
win = WindowDemo()
win.show()
sys.exit(app.exec_())
3.2 QLabel标签快捷键使用
from PyQt5.QtWidgets import *
import sys
# QLabel标签快捷键使用
class Demo1(QDialog):
def __init__(self):
super(Demo1, self).__init__()
self.setWindowTitle('QLabel例子')
nameLb1 = QLabel('&Name', self)
nameEd1 = QLineEdit(self)
nameLb1.setBuddy(nameEd1)
nameLb2 = QLabel('&Password', self)
nameEd2 = QLineEdit( self)
nameLb2.setBuddy(nameEd2)
btnOk = QPushButton('&OK')
btnCancel = QPushButton('&Cancel')
mainLayout = QGridLayout(self)
mainLayout.addWidget(nameLb1,0,0)
mainLayout.addWidget(nameEd1,0,1,1,2)
mainLayout.addWidget(nameLb2,1,0)
mainLayout.addWidget(nameEd2,1,1,1,2)
mainLayout.addWidget(btnOk,2,1)
mainLayout.addWidget(btnCancel,2,2)
def link_hovered():
print("当鼠标划过label-2标签时i,触发事件")
def link_clicked():
print("当用鼠标点击laber-4标签时,触发事件")
if __name__ == '__main__':
app = QApplication(sys.argv)
labelDemo = Demo1()
labelDemo.show()
sys.exit(app.exec_())
按住“ALT+N”快捷键可以切换到第一个文本框,因为其与QLaber进行了关联,“ALT+P”就到了第二个
4 QLineEdit(单行文本框控件)
可以输入单行字符串,多行是QTextEdit类