窗口类型介绍:
窗口类型包括 QMainWindow QWidget QDialog三类,这三个类都是用来创建窗口的,可以直接使用,也可以继承后使用。
接下来介绍一下这三个类的区别:
QMainWindow窗口可以包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式。
QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动。特别需要注意的是,QDialog窗口没有菜单栏、工具栏、状态栏等。
如果确定是主窗口,就使用QMainWindow类,如果是对话框,就使用QDialog类,如果不确定,就使用QWidget类。
接下来,介绍一下QMainWindow类中比较重要的方法,如下图所示:
还有一点需要注意,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)。具体如下图所示:
QWidget类提供了许多成员函数可以获得这些坐标系统的坐标,这些成员函数大致分为三类:
QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的geometry()提供的成员函数:x()、y()获得客户区左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的frameGeometry()提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。具体如下图所示:
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类的继承结构如下图所示:
QDialog类的常用方法如下图所示:
接下来,介绍QDialog的子类:
QMessageBox
QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击不同的标准按钮对消息进行反馈。每个标准按钮都有一个预定义的文本、角色和十六进制数。
QMessageBox类提供了许多常用的弹出式对话框,如提示、警告、错误、询问、关于等对话框。这些不同类型的QMessageBox对话框只是显示时的图标不同,其他功能是一样的。
QMessageBox类的常用方法如下:
QMessageBox的标准按钮类型如下所示:
5种常用的消息对话框及其显示效果如下所示:
应用实例如下:
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_())
QInputDialog
QInputDialog控件是一个标准对话框,由一个文本框和两个按钮(OK按钮和Cancel按钮)组成。当用户单击OK按钮或按Enter键后,在父窗口可以收集通过QInputDialog控件输入的信息。QInputDialog控件是QDialog标准对话框的一部分。
在QInputDialog控件中可以输入数字、字符串或列表中的选项。标签用于提示必要的信息。
QInputDialog类中的常用方法如下:
应用实例如下:
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_())
当调用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_())
QFileDialog
QFileDialog是用于打开和保存文件的标准对话框。QFileDialog类继承自QDialog类。
QFileDialog在打开文件时使用了文件过滤器,用于显示指定扩展名的文件。也可以设置使用QFileDialog打开文件时的起始目录和指定扩展名的文件。
QFileDialog类的常用方法如下:
应用实例如下:
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_())
第一个按钮使用QFileDialog.getOpenFileName(),调用文件对话框来显示图像,并显示在一个标签控件中。它负责打开C盘目录下的文件。
在QFileDialog.getOpenFileName()函数中:
第一个参数用于指定父组件;
第二个参数是QFileDialog对话框的标题;
第三个参数是对话框显示时默认打开的目录
第四个参数是对话框中文件扩展名过滤器
第二个按钮使用文件对话框对象的exec_()方法来选择文件,并把所选文件的内容显示在文本编辑控件中。