PyQt5 GUI编程——窗口类型

窗口类型介绍:
窗口类型包括 QMainWindow QWidget QDialog三类,这三个类都是用来创建窗口的,可以直接使用,也可以继承后使用。
接下来介绍一下这三个类的区别:
QMainWindow窗口可以包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式。
QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动。特别需要注意的是,QDialog窗口没有菜单栏、工具栏、状态栏等。
如果确定是主窗口,就使用QMainWindow类,如果是对话框,就使用QDialog类,如果不确定,就使用QWidget类。

接下来,介绍一下QMainWindow类中比较重要的方法,如下图所示:
PyQt5 GUI编程——窗口类型_第1张图片
还有一点需要注意,QMainWindow不能设置布局(setLayout()方法),因为它有自己的布局。
为了更好的理解,接下来展示创建一个简单的主窗口的代码:

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

class MainWindow(QMainWindow):
	def __init__(self , parent=None):
		super().__init__(parent)
		self.resize(700, 500)
		self.status = self.statusBar()
		self.status.showMessage("状态栏信息",10000)
		self.setWindowTitle("MainWindow 例子")

if __name__ == '__main__':
	app = QApplication(sys.argv)
	app.setWindowIcon(QIcon("./images/cartoon1.ico"))   #需根据实际选择图片的本地路径
	form = MainWindow()
	form.show()
	sys.exit(app.exec_())    #使窗口调用结束时结束程序

接下来介绍如何将主窗口放在屏幕中间
QMainWindow利用QDesktopWidget类来实现主窗口居中显示。下面展示实现的代码:

from PyQt5.QtWidgets import QDesktopWidget, QApplication , QMainWindow
import sys

class Winform(QMainWindow):
	def __init__(self, parent=None):
		super().__init__(parent)
		self.setWindowTitle('主窗口显示在屏幕中间')
		self.resize(700,500)
		self.center()
	def center(self):
		screen = QDesktopWidget().screenGeometry()   #获得计算机屏幕的大小
		size = self.geometry()     #获得QWidget窗口的大小
		self.move((screen.width() - size.width())/2,(screen.height()-size.height())/2)
	
if __name__ == "__main__":
	app = QApplication(sys.argv)
	win = Winform()
	win.show()
	sys.exit(app.exec_())

下面,开始介绍QWidget类:
QWidget类是所有用户界面对象的基类,所有的窗口和控件都直接或间接继承自QWidget类。
QMainWindow和QDialog也都继承自QWidget类,QWidget类中的大部分成员函数,QMainWindow和QDialog都可以使用。
PyQt使用统一的坐标系统来定位窗口控件的位置和大小。以屏幕的左上角为原点,从左向右为x轴正向,从上向下为y轴正向。整个屏幕的坐标系统是用来定位顶层窗口的。窗口内部也有自己的坐标系统,该坐标系统以左上角作为原点,从左向右为x轴正向,从上向下为y轴正向,原点、x轴、y轴围成的区域叫作Client Area(客户区),在客户区的周围则是标题栏(Window Title)和边框(Frame)。具体如下图所示:
PyQt5 GUI编程——窗口类型_第2张图片
QWidget类提供了许多成员函数可以获得这些坐标系统的坐标,这些成员函数大致分为三类:
QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的geometry()提供的成员函数:x()、y()获得客户区左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的frameGeometry()提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。具体如下图所示:
PyQt5 GUI编程——窗口类型_第3张图片

QWidget不包含边框的常用函数
(1)改变客户区的面积:

QWidget.resize(witdh, height)
QWidget.resize(QSize)

除了设置宽度和高度,还可以用鼠标来改变它的大小
(2)获得客户区的大小:

QWidget.size()

(3)获得客户区的宽度和高度

QWidget.width()
QWidget.height()

(4)设置客户区的宽度和高度

QWidget.setFixedWidth(int width)

这个函数会使客户区的高度固定,不可以改变,只可以改变宽度。

QWidget.setFixedHeight(int height)

这时候宽度就是固定的,不可以改变,但是可以改变高度。

QWidget.setFixedSize(QSize size)
QWidget.setFixedSize(int width, int height)

这两个函数会使高度和宽度都是固定的,不可以通过鼠标来改变窗口的宽度和高度。

QWidget.setGeometry(int x, int y, int width, int height)
QWidget.setGeometry(QRect rect)

这两个函数可以同时改变客户区的大小和位置,可以不单独设置x、y坐标。

QWidget含边框的常用函数
通过上面不包含边框函数的设置,就可以设置整个窗口(包含边框)的大小了,所以接下来只介绍获得窗口的位置和大小的函数
(1)获得窗口的大小和位置

QWidget.frameGeometry()

(2)设置窗口的位置

QWidget.move(int x, int y)
QWidget.move(QPoint point)

(3)获得窗口左上角的坐标

QWidget.pos()

为了更好的理解,在这里展示使用上述方法的做成的小窗口的代码:

from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
import sys

app = QApplication(sys.argv)
widget = QWidget()
btn = QPushButton(widget)
btn.setText("Button")
btn.move(20, 20)
widget.resize(300,200)
widget.move(250, 200)
widget.setWindowTitle("PyQt坐标系统例子")
widget.show()
print("QWidget:")
print("w.x()=%d" % widget.x())
print("w.y()=%d" % widget.y())
print("w.width()=%d" % widget.width())
print("w.height()=%d" % widget.height())
print("QWidget.geometry:")
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())
sys.exit(app.exec_())

下面,开始介绍QDialog类:
QDialog类的子类主要有QMessageBox、QFileDialog、QFontDialog、QInputDialog等。
QDialog类的继承结构如下图所示:
PyQt5 GUI编程——窗口类型_第4张图片
QDialog类的常用方法如下图所示:
PyQt5 GUI编程——窗口类型_第5张图片
接下来,介绍QDialog的子类:
QMessageBox
QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击不同的标准按钮对消息进行反馈。每个标准按钮都有一个预定义的文本、角色和十六进制数。
QMessageBox类提供了许多常用的弹出式对话框,如提示、警告、错误、询问、关于等对话框。这些不同类型的QMessageBox对话框只是显示时的图标不同,其他功能是一样的。
QMessageBox类的常用方法如下:
PyQt5 GUI编程——窗口类型_第6张图片
QMessageBox的标准按钮类型如下所示:
PyQt5 GUI编程——窗口类型_第7张图片
5种常用的消息对话框及其显示效果如下所示:
PyQt5 GUI编程——窗口类型_第8张图片
应用实例如下:

import sys 
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class MyWindow(QWidget):
	def __init__(self,parent=None):
		super().__init__(parent)
		self.setWindowTitle("QMessageBox例子")
		self.resize(300,100)
		self.myButton = QPushButton(self)
		self.myButton.setText("点击弹出消息框")
		self.myButton.clicked.connect(self.msg)
		
	def msg(self):
		reply = QMessageBox.information(self,"标题","消息正文",QMessageBox.Yes | QMessageBox.No , QMessageBox.Yes)
		print(reply)
		
if __name__ == '__main__':
	app = QApplication(sys.argv)
	myshow = MyWindow()
	myshow.show()
	sys.exit(app.exec_())

PyQt5 GUI编程——窗口类型_第9张图片
QInputDialog
QInputDialog控件是一个标准对话框,由一个文本框和两个按钮(OK按钮和Cancel按钮)组成。当用户单击OK按钮或按Enter键后,在父窗口可以收集通过QInputDialog控件输入的信息。QInputDialog控件是QDialog标准对话框的一部分。
在QInputDialog控件中可以输入数字、字符串或列表中的选项。标签用于提示必要的信息。
QInputDialog类中的常用方法如下:
PyQt5 GUI编程——窗口类型_第10张图片
应用实例如下:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class InputdialogDemo(QWidget):
	def __init__(self,parent=None):
		super().__init__(parent)
		layout = QFormLayout()
		self.btn1 = QPushButton('获得列表里的选项')
		self.btn1.clicked.connect(self.getItem)
		self.le1 = QLineEdit()
		layout.addRow(self.btn1,self.le1)
		
		self.btn2 = QPushButton('获得字符串')
		self.btn2.clicked.connect(self.getIext)
		self.le2 = QLineEdit()
		layout.addRow(self.btn2,self.le2)
		
		self.btn3 = QPushButton('获得整数')
		self.btn3.clicked.connect(self.getInt)
		self.le3 = QLineEdit()
		layout.addRow(self.btn3,self.le3)
		self.setLayout(layout)
		self.setWindowTitle('Input Dialog 例子')
		
	def getItem(self):
		items = ('C', 'C++', 'Java', 'Python')
		item, ok = QInputDialog.getItem(self, 'select input dialog', '语言列表', items, 0, False)
		if ok and item:
			self.le1.setText(item)
			
	def getIext(self):
		text, ok = QInputDialog.getText(self, 'Text Input Dialog', '输入姓名:')
		if ok:
			self.le2.setText(str(text))
			
	def getInt(self):
		num, ok = QInputDialog.getInt(self, 'integer input dialog', '输入数字')
		if ok:
			self.le3.setText(str(num))
			
if __name__ == '__main__':
	app = QApplication(sys.argv)
	demo = InputdialogDemo()
	demo.show()
	sys.exit(app.exec_())

PyQt5 GUI编程——窗口类型_第11张图片
PyQt5 GUI编程——窗口类型_第12张图片
PyQt5 GUI编程——窗口类型_第13张图片
PyQt5 GUI编程——窗口类型_第14张图片
当调用QInputDialog.getItem()函数时,QInputDialog控件包含一个QCombox控件和两个按钮,用户从QCombox中选择一个选项后,允许用户确认或取消操作。
当调用QInputDialog.getText()函数时,QInputDialog控件包含一个文本框和两个按钮,允许用户输入字符串。
当调用QInputDialog。getInt()函数时,QInputDialog包含一个QSpinBox控件和两个按钮,允许用户输入整数。

QFontDialog
QFontDialog控件是一个常用的字体选择对话框,可以让用户选择所显示文本的字号大小、样式和格式。QFontDialog是QDialog标准对话框的一部分。使用QFontDialog类的静态方法getFont(),可以从字体选择对话框中选择文本的显示字号大小、样式和格式。
应用实例如下:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class FontDialogDemo(QWidget):
	def __init__(self,parent=None):
		super().__init__(parent)
		layout = QVBoxLayout()
		self.fontButton = QPushButton("choose font")
		self.fontButton.clicked.connect(self.getFont)
		layout.addWidget(self.fontButton)
		self.fontLineEdit = QLabel("Hello,测试字体例子")
		layout.addWidget(self.fontLineEdit)
		self.setLayout(layout)
		self.setWindowTitle("Font Dialog例子")
		
	def getFont(self):
		#返回所选择的字体和函数执行的状态
		font,ok = QFontDialog.getFont()  
		#ok的结果为True或False  
		print(ok)           
		if ok:
			#设置格式
			self.fontLineEdit.setFont(font)    
			
if __name__ == "__main__":
	app = QApplication(sys.argv)
	demo = FontDialogDemo()
	demo.show()
	sys.exit(app.exec_())

PyQt5 GUI编程——窗口类型_第15张图片
QFileDialog
QFileDialog是用于打开和保存文件的标准对话框。QFileDialog类继承自QDialog类。
QFileDialog在打开文件时使用了文件过滤器,用于显示指定扩展名的文件。也可以设置使用QFileDialog打开文件时的起始目录和指定扩展名的文件。
QFileDialog类的常用方法如下:
在这里插入图片描述
PyQt5 GUI编程——窗口类型_第16张图片
应用实例如下:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class filedialogdemo(QWidget):
	def __init__(self,parent=None):
		super().__init__(parent)
		layout = QVBoxLayout()
		self.btn = QPushButton("加载图片")
		self.btn.clicked.connect(self.getfile)
		layout.addWidget(self.btn)
		self.le = QLabel("")
		layout.addWidget(self.le)
		self.btn1 = QPushButton("加载文本文件")
		self.btn1.clicked.connect(self.getfiles)
		layout.addWidget(self.btn1)
		self.contents = QTextEdit()
		layout.addWidget(self.contents)
		self.setLayout(layout)
		self.setWindowTitle("File Dialog 例子")
		
	def getfile(self):
		fname, _ = QFileDialog.getOpenFileName(self,'Open file','c:\\','Image files (*.jpg *.gif)')
		self.le.setPixmap(QPixmap(fname))
		
	def getfiles(self):
		dlg = QFileDialog()
		dlg.setFileMode(QFileDialog.AnyFile)
		#只列出文件
		dlg.setFilter(QDir.Files)
		
		#exec_()方法用于选择文件
		if dlg.exec_():           
			filenames = dlg.selectedFiles()
			f = open(filenames[0],'r')
			with f:
				data = f.read()
				self.contents.setText(data)
				
if __name__ == '__main__':
	app = QApplication(sys.argv)
	ex = filedialogdemo()
	ex.show()
	sys.exit(app.exec_())

PyQt5 GUI编程——窗口类型_第17张图片
PyQt5 GUI编程——窗口类型_第18张图片
第一个按钮使用QFileDialog.getOpenFileName(),调用文件对话框来显示图像,并显示在一个标签控件中。它负责打开C盘目录下的文件。
在QFileDialog.getOpenFileName()函数中:
第一个参数用于指定父组件;
第二个参数是QFileDialog对话框的标题;
第三个参数是对话框显示时默认打开的目录
第四个参数是对话框中文件扩展名过滤器

第二个按钮使用文件对话框对象的exec_()方法来选择文件,并把所选文件的内容显示在文本编辑控件中。

你可能感兴趣的:(PyQt5 GUI编程——窗口类型)