PyQt5-02-关于窗口

窗口类型介绍

  • 三个类都可以用来创建窗口,可以直接使用,也可以继承后使用
  • QMainWindow:GUI程序的主窗口,包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式
  • QWidget:所有用户界面对象的基类,所有窗口或者控件都直接或间接继承自QWidget类,有可能作为顶层窗口,也有可能嵌入到其他窗口
  • QDialog:对话框窗口的基类,主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的

窗口的显示状态

  • .showFullScreen() 全屏显示
  • .showMaximized() 最大化显示
  • .showMinimized() 最小化显示
  • .hide() 隐藏窗口,也适合与大多数组件
  • .show() 显示窗口,也适合与大多数组件
  • .windowState() 返回窗口状态
  • isMinimized() 如果窗口最小化,返回值为True;否则,为False;
  • isMaximized() 如果窗口最大化,返回值为True;否则,为False;
  • isFullScreen() 如果窗口全屏显示,返回值为True;否则,为False;
  • isActiveWindow() 如果是活动窗口,返回值为True;否则,为False;;

QMainWindow

  • QMainWindow是QWidget的子类
  • 包含状态栏工具栏菜单栏的经典应用程序框架
  • 如果是根窗口一般继承此类
  • 可以使用绝对布局,不可以使用箱式布局

状态栏

  • 用来显示状态信息的串口部件,在窗口的最下左侧显示

菜单栏

  • 下拉菜单

工具栏

  • 工具栏则提供了快速执行最常用命令的方法
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp
from PyQt5.QtGui import QIcon

class FirstWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUi()

    def initUi(self):
        self.setGeometry(300, 300, 200, 200)
        self.setWindowTitle("第一个窗口")

        #给生成的二级菜单添加一个内容,绑定图标,文本,绑定类(这个按钮属于哪个控件)
        exit_menu = QAction(QIcon(r"1.ico"), "退出", self)
        #绑定一个快捷键
        exit_menu.setShortcut("Ctrl+Q")
        #生成一个菜单按钮链接事件,执行退出命令
        exit_menu.triggered.connect(qApp.quit)

        copy_menu = QAction(QIcon(r"2.ico"), "复制", self)
        copy_menu.setShortcut("Ctrl+C")

        version_menu = QAction(QIcon(r"3.ico"), "版本", self)

        #生成菜单栏
        menubar = self.menuBar()
        #生成一个二级菜单,并命名
        file_bar = menubar.addMenu("文件")
        #给生成的二级菜单添加上面代码生成的二级内容
        file_bar.addAction(exit_menu)
        edit_bar = menubar.addMenu("编辑")
        edit_bar.addAction(copy_menu)
        help_bar = menubar.addMenu("帮助")
        help_bar.addAction(version_menu)

        #生成一个工具
        exit_tool = QAction(QIcon(r"4.ico"), "退出", self)
        exit_tool.triggered.connect(qApp.quit)
        #生成一个工具栏,并给整个工具栏命名
        toolbar = self.addToolBar("工具栏")
        #添加工具
        toolbar.addAction(exit_tool)
       
        #生成每个按钮的状态栏信息
        exit_menu.setStatusTip("退出程序")
        copy_menu.setStatusTip("复制")
        version_menu.setStatusTip("版本")
        exit_tool.setStatusTip("退出程序")
        #生成状态栏
        self.statusBar()

def mainGui():
    app = QApplication(sys.argv)
    #设置显示风格Fusion及windows
    app.setStyle('Fusion')
    firstwindow = FirstWindow()
    firstwindow.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    mainGui()

QWidget

  • 在PyQt5里所有能显示的都是QWidget的子类

1. 控件.setToolTip("气泡显示的内容")

  • 可以设置一个控件的气泡显示内容
  • from PyQt5.QtWidgets import QToolTip导入
  • 通过QToolTip.setFont(QFont('SansSerif', 30))设置气泡文字的字体和字号

2. 获得屏幕尺寸

from PyQt5.QtWidgets import QDesktopWidget
#获得屏幕尺寸
screen = QDesktopWidget().screenGeometry()
#获得屏幕的宽度
width = screen.width()
#获得屏幕的高度
height = screen.height()

3. 获得窗口的属性

from PyQt5.QtWidgets import QWidget
app = QApplication(sys.argv)
firstwindow = QWidget()
print(firstwindow.width()) #获取窗口宽度
print(firstwindow.height()) #获取窗口高度
print(firstwindow.x()) #获取窗口左上角的X坐标
print(firstwindow.y()) #获取窗口左上角的Y坐标

4. 给窗口添加小图标

from PyQt5.QtGui import QIcon
firstwindow = QWidget()
firstwindow.setWindowIcon(QIcon(r"图标路径"))

5. 消息窗口

#关闭窗口时弹出确认窗口
from PyQt5.QtWidgets import QMessageBox
def closeEvent(self, event):
    reply = QMessageBox.question(self,"确认退出","你确定要退出么?",QMessageBoxYes,
    QMessageBoxNo)
    if reply == QMessageBox.Yes:
        event.accept()
    else:
        event.ignore()

定位方式

  • 定位方式分为绝对布局、箱式布局、网格式布局

1. 绝对定位方式

  • QMainWindow()和QWidget()的类窗口都可以用绝对定位方式
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel

class FirstWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUi()
    def initUi(self):
        self.setWindowTitle("第一窗口")
        self.setGeometry(300, 300, 400, 400)
        QLabel('Couldn\'t', self).move(15, 10)
        QLabel('care', self).move(35, 40)
        QLabel('less', self).move(55, 65)
        QLabel('and', self).move(115, 65)
        QLabel('then', self).move(135, 45)
        QLabel('you', self).move(115, 25)
        QLabel('kiss', self).move(145, 10)
        QLabel('me', self).move(215, 10)       
def guiMainLoop():
    app = QApplication(sys.argv)
    firstwindow = FirstWindow()
    firstwindow.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    guiMainLoop()

2. 箱式布局

  • QMainWindow()类窗口不可以使用箱式布局,QWidget()类窗口可以使用箱式布局
  • 可以在QMainWindow()类窗口的中心部件,通过setCentralWidget方法,添加QWidget()类窗口后,使用箱式布局
  • QHBoxLayout() 水平布局
  • QVBoxLayout() 垂直布局
  • .addWidget() 添加部件
  • .addStretch() 添加间隔元素
  • .setLayout() 生成总体布局
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout

class FirstWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUi()
    def initUi(self):
        self.setWindowTitle("第一窗口")
        self.setGeometry(300, 300, 400, 400)

        self.b1 = QPushButton("按钮1")
        self.b2 = QPushButton("按钮2")
        
        #建立一个水平布局
        self.h_box = QHBoxLayout()
        #从左往右添加一个间隔,两个按钮
        self.h_box.addStretch(1)
        self.h_box.addWidget(self.b1)
        self.h_box.addWidget(self.b2)
        
        #建立一个垂直布局
        self.v_box = QVBoxLayout()
        #从上往下添加一个间隔,上面的水平布局
        self.v_box.addStretch(1)
        self.v_box.addLayout(self.h_box)
        
        #生成总体布局
        self.setLayout(self.v_box)

def guiMainLoop():
    app = QApplication(sys.argv)
    firstwindow = FirstWindow()
    firstwindow.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    guiMainLoop()

3. 网格布局

  • QMainWindow()类窗口不可以使用箱式布局,QWidget()类窗口可以使用箱式布局
  • 可以在QMainWindow()类窗口的中心部件,通过setCentralWidget方法,添加QWidget()类窗口后,使用网格布局
  • 该布局方式将窗口空间划分为许多行和列
  • QGridLayout() 创建一个网格布局
  • .addWidget() 在网格中添加部件
  • .setLayout() 生成总体布局
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QMainWindow

class FirstWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUi()
    def initUi(self):
        self.setWindowTitle("第一窗口")
        self.setGeometry(300, 300, 400, 400)

        self.b1 = QPushButton("按钮1")
        self.b2 = QPushButton("按钮2")
        self.b3 = QPushButton("按钮3")
        self.b4 = QPushButton("按钮4")
        self.b5 = QPushButton("按钮5")
        self.b6 = QPushButton("按钮6")
        self.b7 = QPushButton("按钮7")
        self.b8 = QPushButton("按钮8")
        self.b9 = QPushButton("按钮9")

        #实例化一个网格布局
        self.grid = QGridLayout()
        #给网格布局添加部件
        self.grid.addWidget(self.b1, 0, 0)
        self.grid.addWidget(self.b2, 0, 1)
        self.grid.addWidget(self.b3, 0, 2)
        self.grid.addWidget(self.b4, 0, 3)
        self.grid.addWidget(self.b5, 1, 0)
        self.grid.addWidget(self.b6, 1, 1)
        self.grid.addWidget(self.b7, 1, 2)
        self.grid.addWidget(self.b8, 2, 0)
        #参数为 行,列,行跨度,列跨度
        self.grid.addWidget(self.b9, 2, 1, 5, 2)
        #生成总体布局
        self.setLayout(self.grid)

def guiMainLoop():
    app = QApplication(sys.argv)
    firstwindow = FirstWindow()
    firstwindow.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    guiMainLoop()

两个特殊例子

窗口间跳转

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

class FirstWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUi()

    def initUi(self):
        self.resize(300, 300)
        self.move(100, 100)
        self.setWindowTitle("第一个窗口")
        self.btn = QPushButton('进入第二个窗口', self)        
        self.btn.setGeometry(10, 10, 100, 100)        
        self.btn.clicked.connect(self.jumpToSecondWindow)

    def jumpToSecondWindow(self):
        self.hide()
        self.targetwindow = SecondWindow()
        self.targetwindow.show()

class SecondWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.initUi()

    def initUi(self):
        self.resize(300, 300)
        self.move(100, 100)
        self.setWindowTitle("第二个窗口")
        self.btn = QPushButton('进入第一个窗口', self)        
        self.btn.setGeometry(10, 10, 100, 100)
        self.btn.clicked.connect(self.jumpToFirstWindow)

    def jumpToFirstWindow(self):
        self.hide()
        self.targetwindow = FirstWindow()
        self.targetwindow.show()

def guiMainLoop():
    app = QApplication(sys.argv)
    firstwindow = FirstWindow()
    firstwindow.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    guiMainLoop()

窗口内框架隐藏及颜色改变

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


def frameHide():
    firstframe.hide()

app = QApplication(sys.argv)
#显示样式
app.setStyle('Fusion')

rootwindow = QMainWindow()
rootwindow.resize(400, 400)
rootwindow.move(100, 100)

firstframe = QFrame(rootwindow)
firstframe.resize(300, 300)
firstframe.move(0, 0)
#框架改变背景色
firstframe.setStyleSheet('''QFrame{background:#F76677;border-radius:5px;}''')

secondframe = QFrame(rootwindow)
secondframe.resize(40, 40)
secondframe.move(350, 350)
#框架改变背景色
secondframe.setStyleSheet('''QFrame{background:#9AFFB6;border-radius:5px;}''')

btn1 = QPushButton("1",firstframe)
btn1.resize(50, 50)
btn1.move(250, 250)
#部件改变背景色
btn1.setStyleSheet('''QPushButton{background:#818181;border-radius:5px;}''')

btn2 = QPushButton("2",firstframe)
btn2.resize(50, 50)
btn2.move(0, 0)
btn2.clicked.connect(frameHide)

rootwindow.show()
sys.exit(app.exec_())
posted @ 2020-03-09 22:40  TK_tank  阅读(654)  评论(0编辑  收藏  举报