PyQ5 day2


前言

今天终于开始代码的编写啦~继续加油


一、主窗口的主要类型

1.QMainWindow

有菜单栏,工具栏和状态栏,是最常用的窗口格式

2.QDialog

是对话窗口的基类,没有菜单栏,工具栏和状态栏。(有模态和非模态)

3.QWidegt

当不确定窗口用途时,就使用这个类型

4、用代码创建的第一个主窗口

# 时间:2022/10/31 21:50
# cky
from PyQt5.QtWidgets import QApplication,QMainWindow
import sys
from PyQt5.QtGui import QIcon

#创建一个类继承QMainWindow
class FirstMinWin(QMainWindow):
    #重写构造类的方法
    def __init__(self):
        #复用父类构造方法
        '''
        如果重写了__init__时,要继承父类的构造方法,可以使用super
        关键字:
        super(子类,self).__init__(参数1,参数2,....)
        也可以写成:
        super().__init(参数) py3.xx支持,py2.xx不支持
        '''
        super(FirstMinWin, self).__init__()

        self.setWindowTitle('第一个窗口')
        self.resize(400,300)
        #设置了一个状态框
        self.status=self.statusBar()
        #设置状态框内容
        self.status.showMessage('只存在的5秒消息',5000)

if __name__ == '__main__':
    #实例化一个app
     app=QApplication(sys.argv)
    #设置图标
     app.setWindowIcon(QIcon('./image/blackwhite.jpg'))
     #实例化FirstMinwin类
     ui=FirstMinWin()
    #显示窗口
     ui.show()
    #进入主程序以及安全退出
     sys.exit(app.exec())

在这里插入图片描述

二、使窗口居中

现在使用QApplication.primaryScreen().geometry()来获取屏幕信息

代码如下(示例):

# 时间:2022/11/1 9:17
# cky
from PyQt5.QtWidgets import QApplication,QMainWindow
import sys
from PyQt5.QtGui import QIcon

#创建一个类继承QMainWindow
class CenterForm(QMainWindow):
    #重写构造类的方法
    def __init__(self):
        super(CenterForm, self).__init__()
        self.setWindowTitle('第一个窗口')
        self.resize(680,450)
    #定义使窗口居中的函数
    def center(self):
        #获得屏幕的物理大小
        screen=QApplication.primaryScreen().geometry()
        #获得窗口大小
        win=self.geometry()
        self.left=(screen.width()-win.width())/2
        self.top=(screen.height()-win.height())/2
        #移动窗口的左上角的X,Y坐标,使窗口居中
        self.move(self.left,self.top)
if __name__ == '__main__':
    #实例化一个app
     app=QApplication(sys.argv)
    #设置图标
     app.setWindowIcon(QIcon('./image/blackwhite.jpg'))
     #实例化FirstMinwin类
     ui=CenterForm()
    #调用居中函数
     ui.center()
    #显示窗口
     ui.show()
    #进入主程序以及安全退出
     sys.exit(app.exec())

三、退出主应用程序

使用代码实现,而没有用designer的信号与槽来手动绑定
# 时间:2022/11/1 10:19
# cky
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton,QHBoxLayout,QWidget
import sys
from PyQt5.QtGui import QIcon

class ExitApp(QMainWindow):
    def __init__(self):
        super(ExitApp, self).__init__()
        self.resize(400,400)
        #实例化一个按钮,并在按钮上添加时内容
        self.btn=QPushButton('关闭应用程序')
        #实例化一个布局
        layout=QHBoxLayout()
        #在布局上添加上按钮
        layout.addWidget(self.btn)
        #将按钮的单击事件与方法关联起来,注意closeapp没有括号
        self.btn.clicked.connect(self.closeapp)
        #添加一个窗口,这里也不太明白,老师说一般都是这样
        mainframe=QWidget()
        #将布局添加到这个窗口上
        mainframe.setLayout(layout)
        #再将这个窗口添加到主窗口上
        self.setCentralWidget(mainframe)
    #槽,即与关闭按钮绑定在一起
    def closeapp(self):
        #获得触发事件
        sender=self.sender()
        print(sender.text()+'按钮被按下')
        #获得当前程序的实例进行关闭
        app=QApplication.instance()
        app.exit()
if __name__ == '__main__':
    #实例化一个app
     app=QApplication(sys.argv)
    #设置图标
     app.setWindowIcon(QIcon('./image/blackwhite.jpg'))
     #实例化FirstMinwin类
     ui=ExitApp()
    #显示窗口
     ui.show()
    #进入主程序以及安全退出
     sys.exit(app.exec())

在这里插入图片描述

四、获得窗口坐标系

以下三种方法,获得的窗口坐标系有所不同
# 时间:2022/11/1 10:55
# cky
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton,QHBoxLayout,QWidget
import sys
from PyQt5.QtGui import QIcon
def clickme():
    print("1")
    print("QWidget.x():%d" % widget.x())  #窗口横坐标
    print("QWidget.y():%d" %widget.y())  #窗口纵坐标
    print("QWidget.width():%d" % widget.width())  #工作区宽度
    print("QWidget.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()
widget.resize(400,400)**#设置的是工作区大小**
#为btn设置父类
btn=QPushButton(widget)
btn.setText('按钮')
btn.clicked.connect(clickme)
widget.show()
sys.exit(app.exec())

五、设置应用程序及窗口图标

# 时间:2022/11/1 11:23
# cky
from PyQt5.QtWidgets import QApplication,QMainWindow
from PyQt5.QtGui import QIcon
import sys
class Icon(QMainWindow):
    def __init__(self):
        super(Icon, self).__init__()
        self.setWindowTitle("第一个程序")
        self.resize(400,400)
#windows在窗口上设置图标仍然显示,但mac系统下如果设置窗口图标会不显示
#mac下在应用程序下设置图标才会在应用程序和主窗口上显示,但是如果在窗口上设置了图标
#又在应用程序下设置图标,只会在应用程序上显示而不会在窗口上显示
        self.setWindowIcon(QIcon('image/1.ico'))
        #这是在窗口上设置
if __name__ == '__main__':
    app=QApplication(sys.argv)
    #这是在应用程序上设置
    app.setWindowIcon(QIcon('image/1.ico'))
    win=Icon()

    win.show()
    sys.exit(app.exec())

六,给窗口或者控件添加提示信息

# 时间:2022/11/1 14:47
# cky
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton,QHBoxLayout,QWidget,QToolTip
import sys
from PyQt5.QtGui import QFont

class Tooltip(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initui()
    def initui(self):
        self.resize(400,400)
        self.setWindowTitle('添加提示信息')
        #设置提示信息的字体和字号
        QToolTip.setFont(QFont('SansSerif',12))
        #给当前窗体加上提示信息
        self.setToolTip('今天也要加油哦')
        self.btn=QPushButton('按钮')
        self.btn.setToolTip('这是一按钮')
        # 实例化一个布局
        layout = QHBoxLayout()
        # 在布局上添加上按钮
        layout.addWidget(self.btn)
        # 添加一个窗口,这里也不太明白,老师说一般都是这样
        mainframe = QWidget()
        # 将布局添加到这个窗口上
        mainframe.setLayout(layout)
        # 再将这个窗口添加到主窗口上
        self.setCentralWidget(mainframe)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=Tooltip()
    win.show()
    sys.exit(app.exec())

效果:
在这里插入图片描述
在这里插入图片描述

七 、Qlable控件

1、常用方法

方法	                描述
setAlignment()	    按固定值方法对齐文本
setIndent()	        设置文本缩进值
setPixmap()        设置QLabel为一个Pixmap图片
text()	           获取 QLabel 的文本内容
setText()          设置 QLabel 的问本内容
selectedText()	   返回所选择的字符
setBuddy()	       设置 QLabel 的助记符及 buddy(伙伴),即使用 QLabel 快捷键,
                    会在快捷键后将焦点设置到其 buddy 上;
                    buddy 可以是任意 widget 控件。使用setBuddy(QWidget*) 设置,
                    其QLabel 必须是文本内容,并且使用“&”符号设置了助记符
setWordWrap()	    设置是否换行

2、QLabel 常用信号

方法        	      描述
linkActivated	   前提是标签设置为超链接,并且不希望打开这个超链接(
                   即setOpenExternalLinks(False))时,点击此链接会触发事件
linkHovered	       前提是标签设置为超链接,当鼠标指针滑过标签中嵌入的超链接时,触发事件

3.实例Ⅰ

# 时间:2022/11/1 15:46
# cky
from PyQt5.QtWidgets import QApplication,QMainWindow,QLabel,QVBoxLayout,QWidget,QToolTip
import sys
from PyQt5.QtGui import QFont,QPalette,QPixmap #调色板,图片
from PyQt5.QtCore import Qt #一些常量

class LableDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.resize(600,600)
        self.setWindowTitle('Lable实例')

        lable1=QLabel(self)  #括号里设置他的父级是当前窗口
        lable2=QLabel(self)
        lable3=QLabel(self)
        lable4=QLabel(self)

        lable1.setText("<h2>这是一个标签</h2>")
        lable1.setAutoFillBackground(True)  # 自动填充颜色 如果不设置,不会显示颜色
        palette=QPalette() #一个面板
        palette.setColor(QPalette.Window,Qt.blue) #设置面板颜色
        lable1.setPalette(palette) #给lable1添加面板对应颜色
        lable1.setAlignment(Qt.AlignCenter)  #设置对齐方式为居中对齐

        lable2.setText("<a href='#'>点我登录</a>")
        lable2.setAlignment(Qt.AlignLeft)#左对齐
        #绑定鼠标划过lable2时的事件
        lable2.linkHovered.connect(self.linkhover)
        lable3.setPixmap(QPixmap("./image/blackwhite.jpg"))
        #Lable4是一个超链接同时也绑定了一个鼠标触发事件,这两个只能有一个起效,若设置了外部链接为True,则触发事件不会响应
        #反之同理,默认为False
        lable4.setOpenExternalLinks(True)
        lable4.setText("<a href='https://https://www.baidu.com/'>点我进入百度</a>")
        lable4.setToolTip('这是一个超链接')
        lable4.setAlignment(Qt.AlignRight)
        #绑定鼠标触发lable4时的事件
        lable4.linkActivated.connect(self.linkActive)
        layout=QVBoxLayout() #垂直布局

        layout.addWidget(lable1)
        layout.addWidget(lable2)
        layout.addWidget(lable3)
        layout.addWidget(lable4)
        self.setLayout(layout)
        #如果这个类继承自       QMainWindow 则必须添加上一个QWidget到主窗口,否则不会显示
        # mainframe = QWidget()
        # # 将布局添加到这个窗口上
        # mainframe.setLayout(layout)
        # # 再将这个窗口添加到主窗口上
        # self.setCentralWidget(mainframe)
    def linkhover(self):
        print('鼠标滑过触发事件lable2')
    def linkActive(self):
        print('单击触发事件lable4')

if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=LableDemo()
    win.show()
    sys.exit(app.exec())

八、动态加载文件

方法一 动态加载

from PyQt5.QtWidgets import QApplication
class Stats:

    def __init__(self):
        # 从文件中加载UI定义
        self.ui = uic.loadUi("text.ui")
app = QApplication([])
stats = Stats()
stats.ui.show()
app.exec_()

方法二 转化为python文件再导入

from PyQt5.QtWidgets import QApplication,QMainWindow
import buddy
import sys
if __name__ == '__main__':
    app=QApplication(sys.argv)  
    newwindow=QMainWindow() #实例化一个QMainWindow()
    ui=buddy.Ui_MainWindow()  #实例化转为py文件后的类
    ui.setupUi(newwindow)  #传入一个窗口,使用类中的方法
    newwindow.show() #显示
    sys.exit(app.exec_())

两者比较

那么我们该使用哪种方式比较好呢?动态加载还是转化为Python代码?

建议:通常采用动态加载比较方便,因为改动界面后,不需要转化,直接运行,特别方便。

但是,如果 你的程序里面有非qt designer提供的控件, 这时候,需要在代码里面加上一些额外的声明,而且 可能还会有奇怪的问题。往往就 要采用 转化Python代码的方法。

九、页面布局建议:

对界面控件进行布局,经验是 按照如下步骤操作

先不使用任何Layout,把所有控件 按位置 摆放在界面上

然后先从 最内层开始 进行控件的 Layout 设定

逐步拓展到外层 进行控件的 Layout设定

最后调整 layout中控件的大小比例, 优先使用 Layout的 layoutStrentch 属性来控制

十、发布程序

1、pip install pyinstaller
2、使用pyinstaller打包要发布的程序
在该文件的终端输入
直接使用pyinstaller 打包 会导致生成很多文件 不利于使用 加两个参数

pyinstaller -Fw  文件名.py
-w 表示不显示终端
-F 将所有的库打包成一个文件

十一、QLineEdit 控件与其回显模式

1、共四种回显模式

Normal
NoEcho
Password
PasswordEchoOnEdit

2、一个小案例

# 时间:2022/11/1 20:14
# cky
from PyQt5.QtWidgets import *
import sys
class lineEditEcho(QWidget):
    def __init__(self):
        super(lineEditEcho, self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle('回显模式')
        #设置为表单布局
        layout=QFormLayout(self)  #表示把这个表单加到窗体上 否则不显示
        #若这里不写self 则需要在最后加上
        # self.setLayout(layout)
        #设置四个QLineEdit 分别对应四种不同的回显模式
        nomarllist=QLineEdit()
        noecholist=QLineEdit()
        pwdlist=QLineEdit()
        pwdechollist=QLineEdit()
        #表单布局的不同之处 是添加addRow(标签值,哪个QLineEdit)
        layout.addRow("normal",nomarllist)
        layout.addRow("noecho",noecholist)
        layout.addRow("pwd",pwdlist)
        layout.addRow("pwdecho",pwdechollist)
        #设置默认显示内容
        nomarllist.setPlaceholderText('noraml')
        noecholist.setPlaceholderText('noecho')
        pwdlist.setPlaceholderText('pwd')
        pwdechollist.setPlaceholderText('pwdcholist')
        #设置其回显模式
        nomarllist.setEchoMode(QLineEdit.Normal)
        noecholist.setEchoMode(QLineEdit.NoEcho)
        pwdlist.setEchoMode(QLineEdit.Password)
        pwdechollist.setEchoMode(QLineEdit.PasswordEchoOnEdit)
if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=lineEditEcho()
    win.show()
    sys.exit(app.exec())

总结:

今日份也有很努力,明天又是一个积极向上的崔崔呀。
题外话:看了一篇微博:讲男权社会下的微胖
微博博主Ericaliga 的置顶文章
这是我非常喜欢的一位博主!女孩子的救星!摆脱男权社会,活出自我!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值