PyQt5基础学习(三)——通过代码形式基本实现图形窗口

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类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值