GUI编程Pyqt5之窗口部件


简介

QtDesigner提供的默认基类只有 QMainWindow、QWidget 和 QDialog 这3种。QMainWindow 是带有菜单栏和工具栏的主窗口类,QDialog 是各种对话框的基类,而它们全部继承自 QWidget。不仅如此,其实所有的窗口部件都继承自 QWidget,如下图所示(QT的类图)
在这里插入图片描述


一、基础窗口部件 QWidget

1.1 窗口与窗口部件

QWidget 类是所有用户界面对象的基类,被称为基础窗口部件。在图3-1中可以 看到,QWidget 继承自 QObject 类和 QPaintDevice 类,其中 QObject 类是所有支持Qt对象模型(Qt Object Model)的基类,QPaimDevice 类是所有可以绘制的对象的基类。

QMainWindow:可以包含菜单栏、工具栏、状态栏和标题栏,是最常见的窗口形式

QDialog:是对话窗口的基类。没有菜单栏、工具栏、状态栏。

QWidget:不确定窗口的用途,就使用QWidget。


先来看一个例子,如下是Python代码

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


class AppGui(QWidget):
    def __init__(self):
        super(AppGui, self).__init__()
        self.initUI()

    def initUI(self):
        # self无父窗口,不是窗口部件,而是个窗口
        self.setWindowTitle("我是widget")
        #  label1 无父窗口,是个窗口
        self.label1 = QLabel("我是个窗口")
        self.label1.setText("label:我是个窗口")

        # label2指定了父窗口为widget(self),所以是widget的窗口部件,而不是窗口
        label2 = QLabel(self)
        label2.setText("我不是独立窗口,只是widget的子部件")


if __name__ == '__main__':
    # 创建应用程序
    app = QApplication(sys.argv)

    # 在应用程序里创建窗口
    ui = AppGui()
    #  显示窗口
    ui.show()
    ui.label1.show()

    # 进入程序的主循环、并通过exit函数确保主循环安全结束
    sys.exit(app.exec_())

程序中定义了一个 QWidget 类对象 widget 和两个 QLabel 对象 labe1 与 label2 ,其中 labe1 没有父窗口,而 label2 在 widget 中, widget 是其父窗口。然后运行程序,效果如下图所示。
在这里插入图片描述

窗口部件(Widget):这里简称部件,是 Qt 中建立用户界面的主要元素。像主窗口、对话框、标签、还有以后要介绍到的按钮、文本输人框等都是窗口部件。

Qt 中把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏,就像程序中的 widget 和 label1 —样。QMainWindow 和大量的 QDialog 子类是最一般的窗口类型。窗口就是没有父部件的部件,所以又称为顶级部件。与其相对的是非窗口部件,又称为子部件。

1.2 窗口几何布局

对于一个窗口,往往要设置它的大小和运行时出现的位置,这就是本小节要说的窗口几何布局。对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取。可以在帮助索引中查看Window and Dialog Widgets关键字,文档中显示了窗口的几何布局图,如下图所示。
在这里插入图片描述
在这里插入图片描述


二、其他窗口部件

2.1 QFrame 类族

QFrame 类是带有边框的部件的基类,它的子类有最为常用的标签部件 QLabel,另外还有 QLCDNumber、QSplitter、QStackedWidget等

带边框部件最主要的特点就是可以有一个明显的边界框架。QFrame 类的主要功能也就是用来实现不同的边框效果,这主要是由边框形状(Shape)和边框阴影(Shadow)组合来形成的。 QFrame 类中定义的主要边框形状如下图1和图2所示。其中,lineWidth 是边框边界的线的宽度;而 midLineWidth 是在边框中额外插入的一条线的宽度,作用是形成3D效果,并且只在Box、Hline和VLine表现为凸起或者凹陷时有用。QFrame 的这些元素组合成的所有边框效果,如下图3所示。

图片都是java类,不过是一样的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面要讲的部件都是QFrame类的子类,也都是Qt的标准部件,所以大多会在Qt设计器中直接设置其属性。能在属性栏中设置的属性,其类中就一定有相关的函数可以使用代码来实现, 只要根据名字在类的参考文档中查找就可以了。

(1)QLabel

标签 QLabel 部件用来显示文本或者图片。在设计器中往界面拖人一个 Label,然后将其拖大,并在属性栏中设置其对齐方式为 alignment 属性,水平的改为 AlignHCenter,垂直的改为AlignVCenter,这样 QLabel 中的文本就会显示在正中间。属性栏中还有一个 wordwrap,选中它就可以实现文本的自动换行。下面看一下怎么在标签中使用图片。

'''
QLabel控件

setAlignment():设置文本的对齐方式

setIndent():设置文本缩进

text():获取文本内容

setBuddy():设置伙伴关系

setText():设置文本内容

selectedText():返回所选择的字符

setWordWrap():设置是否允许换行

QLabel常用的信号(事件):
1.  当鼠标滑过QLabel控件时触发:linkHovered
2.  当鼠标单击QLabel控件时触发:linkActivated

'''

import sys
from PyQt5.QtWidgets import QVBoxLayout,QMainWindow,QApplication,QLabel,QWidget
from PyQt5.QtGui import QPixmap, QPalette
from PyQt5.QtCore import Qt

class QLabelDemo(QWidget) :
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        label1 = QLabel(self)
        label2 = QLabel(self)
        label3 = QLabel(self)
        label4 = QLabel(self)

        label1.setText("<font color=yellow>这是一个文本标签.</font>")
        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("./images/python.jpg"))
        # 如果设为True,用浏览器打开网页,如果设为False,调用槽函数
        label4.setOpenExternalLinks(True)

        label4.setText("<a href='https://www.baidu.com'>百度一下</a>")

        label4.setAlignment(Qt.AlignRight)

        label4.setToolTip('这是一个超级链接')

        vbox = QVBoxLayout()

        vbox.addWidget(label1)
        vbox.addWidget(label2)
        vbox.addWidget(label3)
        vbox.addWidget(label4)


        label2.linkHovered.connect(self.linkHovered)

        label4.linkActivated.connect(self.linkClicked)

        self.setLayout(vbox)
        self.setWindowTitle('QLabel控件演示')

    def linkHovered(self):
        print('当鼠标滑过label2标签时,触发事件')

    def linkClicked(self):
        print('当鼠标单击label4标签时,触发事件')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = QLabelDemo()
    main.show()
    sys.exit(app.exec_())

2)QLCDNumber
QLCDNumber部件可以让数码显示与液晶数字一样的效果。在 QLCDNumber 中可以显示的数码有0/O、1、2、3、4、5/S、6、7、8、9/g、负号、A、B、C、D、E、F、h、H、L、O、P、r、u、U、Y 、冒号、度符号(输入时使用单引号来代替)和空格。


2.2 按钮部件

QAbstractButton 类是按钮部件的抽象基类,提供了按钮的通用功能。它的子类包括复选框 QCheckBox、标准按钮QPushButton、单选框按钮QRadioButton 和工具按钮 QToolButton。关于这一节,可以参考欢迎中的示例程序 Group Box Example,它在 Widgets 分类中。

(1)QPushButton
QPushButton 部件提供了 一个标准按钮。将按钮的显示文本设置为英文字母,在首字母前添加"&"符号,那么就可以将这个按钮的快捷键设置为 Alt 加上这个字母。其它更多的功能可以查看帮助文档,这里由于篇幅问题就不再介绍了。

(2)QCheckBox、QRadioButton和QGroupBox
对于调查表之类的应用,往往提供多个选项供选择。有些是可以选择多项的,有些只能选择其中一项。复选框 QCheckBox 类提供了同时选择多项的功能,而 QRadioBimon 提供了只能选择一项的功能,一般要把一组按钮放到一个QGroupBox中来进行管理。其它更多的功能可以查看帮助文档,这里由于篇幅问题就不再介绍了。


2.3 行编辑器

行编辑器QLineEdit部件是一个单行的文本编辑器,允许用户输人和编辑单行的纯文本内容,而且提供了一系列有用的功能,包括撤销与恢复、剪切和拖放等操作。其中剪切笈制等功能是行编辑自带的,不用自己编码实现。一些具体功能,可以査看Qt欢迎中的示例程序 Line Edits,它在 Widgets 分类中,这里由于篇幅问题就不再介绍了。


2.4 数值设定框

QAbstractSpinBox 类是一个抽象基类,提供了一个数值设定框和一个行编辑器来显示设定值。它有3个子类 QDateTimeEdit、QSpinBox 和 QDoubleSpinBox 分别用来完成日期时间、整数和浮点数的设定。关于这一小节,可以查看 Widgets 分类下的 Spin Boxes 示例程序,这里由于篇幅问题就不再介绍了。


2.5 滑块部件

QAbstractSlider 类提供了一个区间内的整数值,有一个滑块,可以定位到一个整数区间的任意值。这个类是一个抽象基类,有3个子类 QScrollBar、QSlider 和 QDial。 其中,滚动条 QScrollBar 更多用在 QScrollArea 类中来实现滚动区域;而 QSlider 是最常见的音量控制或多媒体播放进度等滑块;QDial是一个刻度表盘。关于这些部件,可以参考 Widgets 分类下的 Sliders 示例程序,这里由于篇幅问题就不再介绍了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值