Python PyQt6教程七-控件

这是PyQt6教程。本教程适合初学者和中级程序员。阅读本教程后,您将能够编写非平凡的PyQt6应用程序。

代码示例可在本站下载:教程源代码

目录

  • 引言
  • 日期和时间
  • 第一个工程
  • 菜单与工具栏
  • 布局管理
  • 事件和信号
  • 对话框
  • 控件
  • 拖放
  • 绘画

PyQt6 控件

控件是应用程序的基本模块。PyQt6有各种各样的控件,包括按钮、复选框、滑块或列表框。在本节教程中,我们将介绍几个有用的控件:

  • QCheckBox、
  • QPushButton、
  • QSlider、
  • QProgressBar、
  • QCalendarWidget
  • QPixmap
  • QLineEdit
  • QSplitter
  • QComboBox

PyQt6 QCheckBox

QCheckBox是一个有两种状态的小部件:打开和关闭。它是一个带有标签的框。复选框通常用于表示应用程序中可以启用或禁用的功能。

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

In this example, a QCheckBox widget
is used to toggle the title of a window.

Author: Jan Bodnar
Website: zetcode.com
"""

from PyQt6.QtWidgets import QWidget, QCheckBox, QApplication
from PyQt6.QtCore import Qt
import sys


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        cb = QCheckBox('Show title', self)
        cb.move(20, 20)
        cb.toggle()
        cb.stateChanged.connect(self.changeTitle)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QCheckBox')
        self.show()


    def changeTitle(self, state):

        if state == Qt.CheckState.Checked.value:
            self.setWindowTitle('QCheckBox')
        else:
            self.setWindowTitle(' ')


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

我们创建了一个复选框来切换窗口标题。

复制代码
cb = QCheckBox('Show title', self)

这是一个构造器。QCheckBox

复制代码
cb.toggle()

我们已经设置了窗口标题,所以我们也选中了复选框。

复制代码
cb.stateChanged.connect(self.changeTitle)

我们将用户定义的方法连接到信号。该方法切换窗口标题。

changeTitle``stateChanged``changeTitle

复制代码
if state == Qt.CheckState.Checked.value:
    self.setWindowTitle('QCheckBox')
else:
    self.setWindowTitle(' ')

控件的状态在变量中提供给方法。如果选中了控件,我们将设置窗口的标题。否则,我们在标题栏中设置一个空字符串。

QPushButton

QPushButton是一种特殊模式控件。它是一个有两种状态的按钮:按下和未按下。我们通过点击它在这两种状态之间切换。

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

In this example, we create three toggle buttons.
They control the background color of a QFrame.

Author: Jan Bodnar
Website: zetcode.com
"""

from PyQt6.QtWidgets import (QWidget, QPushButton,
        QFrame, QApplication)
from PyQt6.QtGui import QColor
import sys


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        self.col = QColor(0, 0, 0)

        redb = QPushButton('Red', self)
        redb.setCheckable(True)
        redb.move(10, 10)

        redb.clicked[bool].connect(self.setColor)

        greenb = QPushButton('Green', self)
        greenb.setCheckable(True)
        greenb.move(10, 60)

        greenb.clicked[bool].connect(self.setColor)

        blueb = QPushButton('Blue', self)
        blueb.setCheckable(True)
        blueb.move(10, 110)

        blueb.clicked[bool].connect(self.setColor)

        self.square = QFrame(self)
        self.square.setGeometry(150, 20, 100, 100)
        self.square.setStyleSheet("QWidget { background-color: %s }" %
                                  self.col.name())

        self.setGeometry(300, 300, 300, 250)
        self.setWindowTitle('Toggle button')
        self.show()


    def setColor(self, pressed):

        source = self.sender()

        if pressed:
            val = 255
        else:
            val = 0

        if source.text() == "Red":
            self.col.setRed(val)
        elif source.text() == "Green":
            self.col.setGreen(val)
        else:
            self.col.setBlue(val)

        self.square.setStyleSheet("QFrame { background-color: %s }" %
                                  self.col.name())


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在我们的示例中,我们创建了三个切换按钮和一个。我们将的背景颜色设置为黑色。切换按钮可切换颜色值的红色、绿色和蓝色部分。背景颜色取决于按下的切换按钮。QWidget``QWidget

复制代码
self.col = QColor(0, 0, 0)

这是初始的黑色值。

复制代码
redb = QPushButton('Red', self)
redb.setCheckable(True)
redb.move(10, 10)

要创建切换按钮,我们创建一个,并通过调用该方法使其可检查。

QPushButton``setCheckable

复制代码
redb.clicked[bool].connect(self.setColor)

我们将信号连接到用户定义的方法。我们使用与布尔值一起操作的信号。clicked``clicked

复制代码
source = self.sender()

我们得到了被切换的按钮。

复制代码
if source.text() == "Red":
    self.col.setRed(val)

如果是红色按钮,我们会相应地更新颜色的红色部分。

复制代码
self.square.setStyleSheet("QFrame { background-color: %s }" %
    self.col.name())

我们使用样式表来更改背景颜色。样式表用方法更新。

setStyleSheet

PyQt6 QSlider

这是一个具有简单的滑块控件。这个滑块可以前后拉动。通过这种方式,我们为特定任务选择一个值。有时使用滑块比输入数字或使用旋转框更自然。
在我们的示例中,我们显示了一个滑块和一个标签。标签显示图像。滑块控制标签。

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

This example shows a QSlider widget.

Author: Jan Bodnar
Website: zetcode.com
"""

from PyQt6.QtWidgets import (QWidget, QSlider,
        QLabel, QApplication)
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPixmap
import sys


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        sld = QSlider(Qt.Orientation.Horizontal, self)
        sld.setFocusPolicy(Qt.FocusPolicy.NoFocus)
        sld.setGeometry(30, 40, 200, 30)
        sld.valueChanged[int].connect(self.changeValue)

        self.label = QLabel(self)
        self.label.setPixmap(QPixmap('mute.png'))
        self.label.setGeometry(250, 40, 80, 30)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QSlider')
        self.show()


    def changeValue(self, value):

        if value == 0:

            self.label.setPixmap(QPixmap('mute.png'))
        elif 0 < value <= 30:

            self.label.setPixmap(QPixmap('min.png'))
        elif 30 < value < 80:

            self.label.setPixmap(QPixmap('med.png'))
        else:

            self.label.setPixmap(QPixmap('max.png'))


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在我们的示例中,我们模拟了一个音量控制。通过拖动滑块的控制柄,我们可以更改标签上的图像。

复制代码
sld = QSlider(Qt.Orientation.Horizontal, self)

在这里,我们创建一个水平方向的控件。

复制代码
self.label = QLabel(self)
self.label.setPixmap(QPixmap('mute.png'))

我们创建了一个控件,并为其设置了一个初始静态图像。

复制代码
sld.valueChanged[int].connect(self.changeValue)

我们将信号连接到用户定义的方法。 valueChanged``changeValue

复制代码
if value == 0:
    self.label.setPixmap(QPixmap('mute.png'))
...

根据滑块的值,我们将图像设置为标签。在上面的代码中,如果滑块等于零,我们将图像设置为标签。mute.png

PyQt6 QProgressBar

进度条是一个控件,用于处理长时间的任务。它是动画的,这样用户就知道任务正在进行中。该控件在PyQt6工具包中提供了一个水平或垂直的进度条。程序员可以设置进度条的最小值和最大值。默认值为0和99。QProgressBar

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

This example shows a QProgressBar widget.

Author: Jan Bodnar
Website: zetcode.com
"""

from PyQt6.QtWidgets import (QWidget, QProgressBar,
        QPushButton, QApplication)
from PyQt6.QtCore import QBasicTimer
import sys


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        self.pbar = QProgressBar(self)
        self.pbar.setGeometry(30, 40, 200, 25)

        self.btn = QPushButton('Start', self)
        self.btn.move(40, 80)
        self.btn.clicked.connect(self.doAction)

        self.timer = QBasicTimer()
        self.step = 0

        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('QProgressBar')
        self.show()


    def timerEvent(self, e):

        if self.step >= 100:

            self.timer.stop()
            self.btn.setText('Finished')
            return

        self.step = self.step + 1
        self.pbar.setValue(self.step)


    def doAction(self):

        if self.timer.isActive():
            self.timer.stop()
            self.btn.setText('Start')
        else:
            self.timer.start(100, self)
            self.btn.setText('Stop')


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在我们的示例中,我们有一个水平进度条和一个按钮。按钮启动和停止进度条。

复制代码
self.pbar = QProgressBar(self)

这是一个构造器。QProgressBar

复制代码
self.timer = QBasicTimer()

要激活进度条,我们使用计时器对象。

复制代码
self.timer.start(100, self)

要启动计时器事件,我们调用它的方法。此方法有两个参数:超时和接收事件的对象。 start

复制代码
def timerEvent(self, e):

    if self.step >= 100:

        self.timer.stop()
        self.btn.setText('Finished')
        return

    self.step = self.step + 1
    self.pbar.setValue(self.step)

每个及其子代都有一个事件处理程序。为了对计时器事件做出反应,我们重新实现了事件处理程序。QObject``timerEvent

复制代码
def doAction(self):

    if self.timer.isActive():
        self.timer.stop()
        self.btn.setText('Start')

    else:
        self.timer.start(100, self)
        self.btn.setText('Stop')

在方法内部,我们启动和停止计时器。doAction

PyQt6 QCalendarWidget

这提供了一个基于月度的日历小部件。它允许用户以简单直观的方式选择日期。

QCalendarWidget

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

This example shows a QCalendarWidget widget.

Author: Jan Bodnar
Website: zetcode.com
"""

from PyQt6.QtWidgets import (QWidget, QCalendarWidget,
        QLabel, QApplication, QVBoxLayout)
from PyQt6.QtCore import QDate
import sys


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        vbox = QVBoxLayout(self)

        cal = QCalendarWidget(self)
        cal.setGridVisible(True)
        cal.clicked[QDate].connect(self.showDate)

        vbox.addWidget(cal)

        self.lbl = QLabel(self)
        date = cal.selectedDate()
        self.lbl.setText(date.toString())

        vbox.addWidget(self.lbl)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('Calendar')
        self.show()


    def showDate(self, date):
        self.lbl.setText(date.toString())


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

该示例有一个日历控件和一个标签控件。当前选定的日期显示在标签控件中。

复制代码
cal = QCalendarWidget(self)

已创建。QCalendarWidget

复制代码
cal.clicked[QDate].connect(self.showDate)

如果我们从控件中选择一个日期,则会发出一个信号。我们将此信号连接到用户定义的方法。

clicked[QDate]``showDate

复制代码
def showDate(self, date):

    self.lbl.setText(date.toString())

我们通过调用该方法检索所选日期。然后,我们将日期对象转换为字符串,并将其设置为标签控件。

PyQt6 QPixmap

这是是用于处理图像的控件之一。它针对在屏幕上显示图像进行了优化。在我们的代码示例中,我们将使用在窗口上显示图像。

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

In this example, we display an image
on the window.

Author: Jan Bodnar
Website: zetcode.com
"""

from PyQt6.QtWidgets import (QWidget, QHBoxLayout,
        QLabel, QApplication)
from PyQt6.QtGui import QPixmap
import sys


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        hbox = QHBoxLayout(self)
        pixmap = QPixmap('sid.jpg')

        lbl = QLabel(self)
        lbl.setPixmap(pixmap)

        hbox.addWidget(lbl)
        self.setLayout(hbox)

        self.move(300, 200)
        self.setWindowTitle('Sid')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在我们的示例中,我们在窗口上显示一个图像。

复制代码
pixmap = QPixmap('sid.jpg')

我们创建一个对象。它将文件名作为参数。QPixmap

复制代码
lbl = QLabel(self)
lbl.setPixmap(pixmap)

我们将位图放入控件中。QLabel

PyQt6 QLineEdit

QLineEdit是一个小部件,允许输入和编辑一行纯文本。小部件有撤消和重做、剪切和粘贴以及拖放功能。

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

This example shows text which
is entered in a QLineEdit
in a QLabel widget.

Author: Jan Bodnar
Website: zetcode.com
"""

import sys
from PyQt6.QtWidgets import (QWidget, QLabel,
        QLineEdit, QApplication)


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        self.lbl = QLabel(self)
        qle = QLineEdit(self)

        qle.move(60, 100)
        self.lbl.move(60, 40)

        qle.textChanged[str].connect(self.onChanged)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QLineEdit')
        self.show()


    def onChanged(self, text):

        self.lbl.setText(text)
        self.lbl.adjustSize()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

此示例显示了一个行编辑控件和一个标签。我们在行编辑中键入的文本会立即显示在标签控件中。

复制代码
qle = QLineEdit(self)

控件已创建。QLineEdit

复制代码
qle.textChanged[str].connect(self.onChanged)

如果行编辑控件中的文本发生更改,我们将调用该方法。onChanged

复制代码
def onChanged(self, text):
    
    self.lbl.setText(text)
    self.lbl.adjustSize() 

在该方法中,我们将键入的文本设置为标签控件。我们调用该方法将标签的大小调整为文本的长度。onChanged``adjustSize

PyQt6 QSplitter

QSplitter允许用户通过拖动子控件之间的边界来控制子控件的大小。在我们的示例中,我们展示了三个由两个拆分器组织的控件。QFrame

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

This example shows
how to use QSplitter widget.

Author: Jan Bodnar
Website: zetcode.com
"""

import sys

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import (QWidget, QHBoxLayout, QFrame,
        QSplitter, QApplication)


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        hbox = QHBoxLayout(self)

        topleft = QFrame(self)
        topleft.setFrameShape(QFrame.Shape.StyledPanel)

        topright = QFrame(self)
        topright.setFrameShape(QFrame.Shape.StyledPanel)

        bottom = QFrame(self)
        bottom.setFrameShape(QFrame.Shape.StyledPanel)

        splitter1 = QSplitter(Qt.Orientations.Horizontal)
        splitter1.addWidget(topleft)
        splitter1.addWidget(topright)

        splitter2 = QSplitter(Qt.Orientations.Vertical)
        splitter2.addWidget(splitter1)
        splitter2.addWidget(bottom)

        hbox.addWidget(splitter2)
        self.setLayout(hbox)

        self.setGeometry(300, 300, 450, 400)
        self.setWindowTitle('QSplitter')
        self.show()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在我们的示例中,我们有三个框架控件和两个拆分器。请注意,在某些主题下,拆分器可能不太明显。

复制代码
topleft = QFrame(self)
topleft.setFrameShape(QFrame.Shape.StyledPanel)

我们使用样式化的框架来查看控件之间的边界。 QFrame

复制代码
splitter1 = QSplitter(Qt.Orientations.Horizontal)
splitter1.addWidget(topleft)
splitter1.addWidget(topright)

我们创建了一个控件,并在其中添加了两个框架。QSplitter

复制代码
splitter2 = QSplitter(Qt.Orientations.Vertical)
splitter2.addWidget(splitter1)

我们还可以将拆分器添加到另一个拆分器控件中。

PyQt6 QComboBox

QComboBox是一个允许用户从选项列表中进行选择的控件。

复制代码
#!/usr/bin/python

"""
ZetCode PyQt6 tutorial

This example shows how to use
a QComboBox widget.

Author: Jan Bodnar
Website: zetcode.com
"""

import sys

from PyQt6.QtWidgets import (QWidget, QLabel,
        QComboBox, QApplication)


class Example(QWidget):

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

        self.initUI()


    def initUI(self):

        self.lbl = QLabel('Ubuntu', self)

        combo = QComboBox(self)

        combo.addItem('Ubuntu')
        combo.addItem('Mandriva')
        combo.addItem('Fedora')
        combo.addItem('Arch')
        combo.addItem('Gentoo')

        combo.move(50, 50)
        self.lbl.move(50, 150)

        combo.textActivated[str].connect(self.onActivated)

        self.setGeometry(300, 300, 450, 400)
        self.setWindowTitle('QComboBox')
        self.show()


    def onActivated(self, text):

        self.lbl.setText(text)
        self.lbl.adjustSize()


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

示例显示了a和a。组合框中有五个选项。这些是Linux发行版的名称。标签控件显示组合框中的选定选项。QComboBox``QLabel

复制代码
combo = QComboBox(self)

combo.addItem('Ubuntu')
combo.addItem('Mandriva')
combo.addItem('Fedora')
combo.addItem('Arch')
combo.addItem('Gentoo')

我们创建了一个有五个选项的控件。

复制代码
combo.textActivated[str].connect(self.onActivated)

在选择项目后,我们调用该方法。

复制代码
def onActivated(self, text):
  
    self.lbl.setText(text)
    self.lbl.adjustSize() 

在该方法中,我们将所选项目的文本设置为标签控件。同时调整标签的大小。

相关推荐
keep one's resolveY22 分钟前
时区问题解决
数据库
Leinwin33 分钟前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
qq_4176950539 分钟前
机器学习与人工智能
jvm·数据库·python
漫随流水41 分钟前
旅游推荐系统(view.py)
前端·数据库·python·旅游
ego.iblacat1 小时前
MySQL 服务基础
数据库·mysql
yy我不解释2 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
Maverick062 小时前
Oracle Redo 日志操作手册
数据库·oracle
紫丁香3 小时前
AutoGen详解一
后端·python·flask
FreakStudio3 小时前
不用费劲编译ulab了!纯Mpy矩阵micronumpy库,单片机直接跑
python·嵌入式·边缘计算·电子diy
攒了一袋星辰3 小时前
高并发强一致性顺序号生成系统 -- SequenceGenerator
java·数据库·mysql