PyQt5常见布局、控件用法有哪些?

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 这是关于Python GUI编程中使用的布局和控件的简要介绍:- **布局**: - `QHBoxLayout`:用于水平排列控件。 - `QVBoxLayout`:用于垂直排列控件。 - `QGridLayout`:在网格中排列控件,支持多行多列。 - `QFormLayout`:创建表单样式的布局,方便组织输入字段。

布局

  • QHBoxLayout - 水平布局。

ini

代码解读

复制代码

tab1 = QtWidgets.QWidget()    # 新建页面
tab1_layout = QtWidgets.QHBoxLayout()    # 新建水平布局
tab1_layout.addWidget(button)    # 向布局中添加单个控件
tab1.setLayout(tab1_layout)    # 将水平布局添加到页面

  • QVBoxLayout - 垂直布局。

ini

代码解读

复制代码

tab1 = QtWidgets.QWidget()    # 新建页面
tab1_layout = QtWidgets.QVBoxLayout()    # 新建垂直布局
tab1.setLayout(tab1_layout)    # 将垂直布局添加到页面

  • QGridLayout - 在网格中组织小部件。

python

代码解读

复制代码

self.tab1_gridLayout = QtWidgets.QGridLayout()    # 新建网格布局
self.tab1_gridLayout.setHorizontalSpacing(30)    # 设置水平间距
self.tab1_gridLayout.setVerticalSpacing(30)    # 设置垂直间距
self.tab1_gridLayout.setContentsMargins(30, 30, 30, 30)    # 设置内容边距(左,上,右,下)

self.tab1_lable_pc_ip = QtWidgets.QLabel()
self.tab1_gridLayout.addWidget(self.tab1_lable_pc_ip, 0, 0)    # 将控件添加至布局

self.tab1_lineEdit_pc_ip = QtWidgets.QLineEdit()
self.tab1_gridLayout.addWidget(self.tab1_lineEdit_pc_ip, 1, 0)

tab1_layout.addLayout(self.tab1_gridLayout)    # 将网格布局添加至水平/垂直布局

  • QFormLayout - 表单布局。

ini

代码解读

复制代码

# 创建一个 QFormLayout 实例
layout = QFormLayout()

# 添加一些字段到布局中
layout.addRow("姓名:", QLineEdit()) # 直接在 addRow 中创建 QLineEdit
layout.addRow("年龄:", QLineEdit())

# 可以先创建控件,然后把它们作为参数传递给 addRow
emailLabel = QLabel("邮箱:")
emailField = QLineEdit()
layout.addRow(emailLabel, emailField)

acceptTermsCheckBox = QCheckBox("我接受条款和条件")
layout.addRow("", acceptTermsCheckBox) # 对于复选框,左侧标签留空

submitButton = QPushButton("提交")
layout.addRow("", submitButton) # 提交按钮,左侧标签留空

# 设置窗口的布局
self.setLayout(layout)

常用控件

  • QLabel - 显示文本或图片。

scss

代码解读

复制代码

font = QFont()
font.setPointSize(12)

self.tab1_lable_name = QtWidgets.QLabel()
self.tab1_lable_name.setText("name")    # 设置lable名
self.tab1_lable_name.setFont(font)    # 设置字体大小
layout.addWidget(self.tab1_lable_name)    # 添加到布局
  • QPushButton - 命令按钮。

python

代码解读

复制代码

self.PushButton_run = QPushButton("执行")
self.PushButton_run.setFont(font)
self.PushButton_run.setEnabled(False)
self.PushButton_run.clicked.connect(self.run)
layout.addWidget(self.PushButton_run)    # 添加到布局

# 修改样式
self.button.setStyleSheet("""
            QPushButton {
                border-radius: 20px;    # 设置圆角的大小
                background-color: lightblue; # 设置背景色
                padding: 6px;           # 设置内边距
            }
            QPushButton:pressed {     # 设置按钮被按下时的样式
                background-color: darkblue;
            }
        """)
  • QRadioButton - 单选按钮。

python

代码解读

复制代码

self.RadioButton_1 = QRadioButton('RadioButton_1')
self.RadioButton_1.setChecked(True)    # 默认选中
self.RadioButton_1.clicked.connect(self.onRadioButtonClicked)
self.RadioButton_2 = QRadioButton('RadioButton_2')
self.RadioButton_2.clicked.connect(self.onRadioButtonClicked)
layout.addWidget(self.RadioButton_1)    # 添加到布局
layout.addWidget(self.RadioButton_2)    # 添加到布局

def onRadioButtonClicked(self):
       # 判断是哪个按钮被选中,并更新标签文本
       radioButton = self.sender()
       if radioButton.isChecked():
           self.label.setText(f"{radioButton.text()} 被选中")
  • QCheckBox - 多选框。

python

代码解读

复制代码

self.cb1 = QCheckBox("选项 1")
self.cb2 = QCheckBox("选项 2")
self.cb1.stateChanged.connect(self.onCheckBoxClicked)
self.cb2.stateChanged.connect(self.onCheckBoxClicked)
layout.addWidget(self.cb1)
layout.addWidget(self.cb2)

def onCheckBoxClicked(self):
       # 初始化一个空字符串用以存放结果
       result = "已选中:"

       # 检查复选框的状态并更新字符串
       if self.cb1.isChecked():
           result += "选项 1 "
       if self.cb2.isChecked():
           result += "选项 2 "

  • QSlider - 滑块控件。
  • QProgressBar - 进度条。
  • QLineEdit - 单行文本输入框。

python

代码解读

复制代码

self.lineEdit = QtWidgets.QLineEdit()
self.lineEdit.setText("host_ip:")
self.lineEdit.setFont(font)
self.lineEdit.setPlaceholderText("输入IP,回车结束")  # 设置提示文


self.lineEdit.textChanged.connect(self.onTextChanged)    # 每当文本改变时,都会发出此信号
self.lineEdit.textEdited.connect(self.onTextChanged)    #用户通过键入改变文本时,发出此信号(不包括通过编程方式更改文本)
self.lineEdit.returnPressed.connect(self.onReturnPressed)    # 当用户在该控件中按下回车(或确定)键时,发出此信号

layout.addWidget(self.lineEdit)    # 添加控件到布局中

def onTextChanged(self, text):
    print(text)

def onReturnPressed(self):
    print(self.lineEdit.text())

  • QTextEdit - 多行文本编辑控件。

python

代码解读

复制代码

self.tab1_TextEdit_reply = QtWidgets.QTextEdit()
self.tab1_TextEdit_reply.setText("reply:")
self.tab1_TextEdit_reply.setFixedHeight(100)  # 将高度设置为100像素
self.tab1_TextEdit_reply.textChanged.connect(self.onTextChanged)    # 每当文本改变时,都会发出此信号
self.tab1_TextEdit_reply.cursorPositionChanged.connect(self.onTextChanged)    #当光标位置改变时发出此信号
self.tab1_TextEdit_reply.selectionChanged.connect(self.onReturnPressed)    # 当文本的选择区域变化时发出此信号
  • QComboBox - 下拉选择框。

python

代码解读

复制代码

self.combo = QComboBox()

# 向下拉列表中添加条目

self.combo.addItem('选项 1')
self.combo.addItem('选项 2')
self.combo.addItem('选项 3')

self.combo.currentIndexChanged.connect(self.selectionChanged)    # 当选项改变时触发的信号

def selectionChanged(self, i):
    text = self.combo.currentText()    # 获取当前选中的文本并通过弹窗显示
    print(f'选中的是: {text}')
  • QSpinBox - 数字输入框。
  • QDateEdit, QTimeEdit, QDateTimeEdit - 日期和时间输入控件。

scss

代码解读

复制代码

self.data_now = QDateEdit()
self.data_now.setDateTime(QtCore.QDateTime.currentDateTime())

高级控件

  • QTreeWidget - 显示树形结构数据。

python

代码解读

复制代码

self.tree_widget = QtWidgets.QTreeWidget()
# 设置列数和列标题
self.tree_widget.setColumnCount(1)
self.tree_widget.setHeaderLabels(['Name'])


self.root_item = QtWidgets.QTreeWidgetItem(self.tree_widget, "root_item_name")
self.child_item = QtWidgets.QTreeWidgetItem(self.root_item, "child_item_name")
self.root_item.addChild(self.child_item)  # 可选的,因为子项已经通过构造函数添加
# 展开所有节点
self.tree_widget.expandAll()
self.tree_widget.clicked.connect(self.tab2_tree_onClicked)
splitter.addWidget(self.tree_widget)    # 将树的布局 添加至QSplitter

  • QListWidget - 显示列表数据。
  • QTableWidget - 显示表格数据。

python

代码解读

复制代码

self.table = QtWidgets.QTableWidget()
# 设置行数和列数
self.table.setRowCount(4)  # 4 行
self.table.setColumnCount(3)  # 3 列
self.table.setColumnWidth(0, 100)  # 为第一列设置宽度 100
self.table.setRowHeight(0, 50)     # 为第一行设置高度 50

# 设置列标题
self.table.setHorizontalHeaderLabels(["列 1", "列 2", "列 3"])
self.table.setItem(0, 0, QtWidgets.QTableWidgetItem(str(device_ip)).setFont(font))  # 显示ip
tab1_content_layout.addWidget(self.table)    # 添加到布局



相关文章
|
运维 Prometheus 监控
提升运维效率:自动化工具的应用与实践
运维工作作为信息技术领域的重要组成部分,其效率和质量直接关系到整个系统的稳定运行。随着科技的进步,自动化工具在运维中的应用越来越广泛。本文将探讨几种常见的自动化工具及其在实际操作中的应用案例,旨在为读者提供一些提升运维效率的思路和方法。通过合理利用这些工具,运维人员不仅可以提高工作效率,还能有效降低出错率,从而保障系统的高可用性。
377 24
|
网络协议 安全 Shell
`nmap`是一个开源的网络扫描工具,用于发现网络上的设备和服务。Python的`python-nmap`库允许我们在Python脚本中直接使用`nmap`的功能。
`nmap`是一个开源的网络扫描工具,用于发现网络上的设备和服务。Python的`python-nmap`库允许我们在Python脚本中直接使用`nmap`的功能。
|
Python
pyinstaller 安装使用
【7月更文挑战第8天】
1432 3
Cannot read properties of undefined (reading ‘use‘)-------编程版本问题
Cannot read properties of undefined (reading ‘use‘)-------编程版本问题
|
Python
Python内置函数map、split、join讲解
Python内置函数map、split、join讲解
1731 0
|
文字识别 索引
Halcon 学习笔记七:文字识别案例
Halcon 学习笔记七:文字识别案例
401 0
|
存储 人工智能 Android开发
[oeasy]python0132_[趣味拓展]emoji_表情符号_抽象话_由来_流汗黄豆
[oeasy]python0132_[趣味拓展]emoji_表情符号_抽象话_由来_流汗黄豆
2172 0
[oeasy]python0132_[趣味拓展]emoji_表情符号_抽象话_由来_流汗黄豆
|
Oracle 关系型数据库 MySQL
Error:QSqlDatabase: QMYSQL driver not loaded (Qt+C++ 找不到mysql的驱动)
Error:QSqlDatabase: QMYSQL driver not loaded (Qt+C++ 找不到mysql的驱动)
1331 0
Error:QSqlDatabase: QMYSQL driver not loaded (Qt+C++ 找不到mysql的驱动)
|
Web App开发 网络协议 网络安全
使用mkcert工具生成受信任的本地SSL证书
使用mkcert工具生成受信任的本地SSL证书
1239 0
|
关系型数据库 MySQL Java
Linux系统下java程序获取的时间与系统时间不一致的问题
解决Linux系统下java程序获取的时间与系统时间不一致的问题
1619 0
Linux系统下java程序获取的时间与系统时间不一致的问题