python pyqt左侧树右侧表格
时间: 2023-09-01 14:04:31 浏览: 116
Python是一种高级编程语言,而PyQt是Python的一个GUI库,用于创建图形用户界面。在使用PyQt创建GUI界面时,常常会用到左侧树和右侧表格的布局。
左侧树是用来展示项目或目录结构的一种常见布局方式。通过在树上添加树节点,可以将项目按层级关系组织起来,并可以展开或折叠各个节点。这样用户就可以通过点击树节点来选择需要查看的项目或目录。左侧树一般使用QTreeView控件实现,可以通过设置模型和委托来自定义树的显示方式。
右侧表格是用来展示详细信息或者数据列表的一种布局方式。通过在表格中添加表头和行数据,可以呈现出具体的信息或数据。右侧表格一般使用QTableView控件实现,可以通过设置模型来管理表格的数据,并可以进行排序、过滤等操作。
左侧树和右侧表格的结合使用可以实现一种常见的布局方式,适用于需要同时展示项目结构和详细信息或数据的场景。用户可以通过点击左侧树节点来选择需要查看的项目,右侧表格会实时显示该项目的详细信息或数据。这种布局方式可以提高用户的操作效率和体验。
总结起来,Python的PyQt库提供了丰富的控件来创建GUI界面,其中左侧树和右侧表格的组合是一种常见的布局方式。左侧树用于展示项目结构,右侧表格用于展示详细信息或数据,通过点击左侧树节点可以实现动态刷新右侧表格。这种布局方式可以有效提升用户操作效率和体验。
相关问题
pyqt5设计一个左边是员工信息,右边显示数字的界面,数字来源def get_data(): ser = serial.Serial('COM3', 9600) data = ser.readline() if data: # 将字符串按空格分割,并取第三个元素作为数值 value_str = data.decode().strip().split()[1] value = float(value_str) ser.close() return value
好的,我们可以使用PyQt5中的QSplitter控件来实现左右分割的效果。在左边的区域,我们可以使用QTableWidget来展示员工信息。在右边的区域,我们可以使用QLabel来显示数字。代码如下:
```python
import serial
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QSplitter, QTableWidget, QTableWidgetItem, QLabel
def get_data():
ser = serial.Serial('COM3', 9600)
data = ser.readline()
if data:
# 将字符串按空格分割,并取第三个元素作为数值
value_str = data.decode().strip().split()[1]
value = float(value_str)
ser.close()
return value
class EmployeeInfo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建表格控件
tableWidget = QTableWidget()
tableWidget.setColumnCount(2)
tableWidget.setHorizontalHeaderLabels(['姓名', '工号'])
# 添加数据
data = [('张三', '001'), ('李四', '002'), ('王五', '003')]
for i in range(len(data)):
name = QTableWidgetItem(data[i][0])
id = QTableWidgetItem(data[i][1])
tableWidget.setItem(i, 0, name)
tableWidget.setItem(i, 1, id)
# 创建布局
layout = QVBoxLayout()
layout.addWidget(tableWidget)
self.setLayout(layout)
class NumberDisplay(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建标签控件
label = QLabel('0')
label.setAlignment(Qt.AlignCenter)
label.setStyleSheet('font-size: 100px;')
# 创建布局
layout = QVBoxLayout()
layout.addWidget(label)
self.setLayout(layout)
# 定时更新标签显示的数字
self.timer = QTimer()
self.timer.timeout.connect(self.update_number)
self.timer.start(1000)
def update_number(self):
value = get_data()
if value:
self.label.setText(str(value))
class MainWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建左右分割控件
splitter = QSplitter(Qt.Horizontal)
# 添加左边的员工信息控件
employeeInfo = EmployeeInfo()
splitter.addWidget(employeeInfo)
# 添加右边的数字显示控件
numberDisplay = NumberDisplay()
splitter.addWidget(numberDisplay)
# 创建布局
layout = QVBoxLayout()
layout.addWidget(splitter)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication([])
mainWidget = MainWidget()
mainWidget.show()
app.exec_()
```
在这个例子中,我们定义了三个QWidget子类:EmployeeInfo、NumberDisplay和MainWidget。EmployeeInfo用于展示员工信息,NumberDisplay用于显示数字,MainWidget用于将两个控件放在一起。我们使用QSplitter来实现左右分割的效果,将两个子控件添加到QSplitter中即可。在NumberDisplay中,我们使用定时器来定时更新显示的数字。get_data函数用于从串口读取数据,并返回数值。注意,这个例子中涉及到串口的操作,需要先安装pyserial库。
pyqt5创建可以增删改查的数据库的界面的代码
非常感谢您的提问。以下是使用PyQt5创建可以增删改查的数据库界面的代码:
```python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem, QVBoxLayout, QHBoxLayout, QWidget, QLabel, QLineEdit, QPushButton, QTableWidget, QMessageBox
from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel
class ContactsWindow(QMainWindow):
def __init__(self):
super().__init__()
# 设置窗口的标题和大小
self.setWindowTitle("联系人管理系统")
self.setMinimumSize(800, 600)
# 创建数据库连接
self.db = QSqlDatabase.addDatabase("QSQLITE")
self.db.setDatabaseName("contacts.db")
if not self.db.open():
QMessageBox.critical(None, "无法打开数据库", "无法连接数据库,添加联系人功能无法使用")
return
# 创建“联系人”表
query = QSqlQuery()
query.exec_(
"CREATE TABLE IF NOT EXISTS contacts (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(40), phone VARCHAR(12), email VARCHAR(40))")
# 创建左侧的表格
self.table = QTableWidget(self)
self.table.setColumnCount(4)
self.table.setHorizontalHeaderLabels(["ID", "姓名", "手机", "邮箱"])
self.table.verticalHeader().setVisible(False)
self.load_contacts()
# 创建右侧的表单
self.name_label = QLabel("姓名:")
self.name_input = QLineEdit()
self.phone_label = QLabel("手机:")
self.phone_input = QLineEdit()
self.email_label = QLabel("邮箱:")
self.email_input = QLineEdit()
self.add_button = QPushButton("添加")
self.add_button.clicked.connect(self.add_contact)
self.update_button = QPushButton("更新")
self.update_button.clicked.connect(self.update_contact)
self.delete_button = QPushButton("删除")
self.delete_button.clicked.connect(self.delete_contact)
form_layout = QVBoxLayout()
form_layout.addWidget(self.name_label)
form_layout.addWidget(self.name_input)
form_layout.addWidget(self.phone_label)
form_layout.addWidget(self.phone_input)
form_layout.addWidget(self.email_label)
form_layout.addWidget(self.email_input)
form_layout.addWidget(self.add_button)
form_layout.addWidget(self.update_button)
form_layout.addWidget(self.delete_button)
form_widget = QWidget()
form_widget.setLayout(form_layout)
# 把左侧的表格和右侧的表单放到一个水平布局中
hbox = QHBoxLayout()
hbox.addWidget(self.table)
hbox.addWidget(form_widget)
# 把水平布局放到窗口中
central_widget = QWidget()
central_widget.setLayout(hbox)
self.setCentralWidget(central_widget)
# 从数据库中读取所有联系人信息,并显示在左侧的表格中
def load_contacts(self):
query = QSqlQuery()
query.exec_("SELECT * FROM contacts")
row = 0
while query.next():
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(str(query.value(0))))
self.table.setItem(row, 1, QTableWidgetItem(str(query.value(1))))
self.table.setItem(row, 2, QTableWidgetItem(str(query.value(2))))
self.table.setItem(row, 3, QTableWidgetItem(str(query.value(3))))
row += 1
# 添加联系人
def add_contact(self):
name = self.name_input.text().strip()
phone = self.phone_input.text().strip()
email = self.email_input.text().strip()
if not name or not phone:
QMessageBox.warning(self, "警告", "姓名和手机不能为空")
return
query = QSqlQuery()
query.prepare("INSERT INTO contacts(name, phone, email) VALUES (:name, :phone, :email)")
query.bindValue(":name", name)
query.bindValue(":phone", phone)
query.bindValue(":email", email)
if query.exec_():
row = self.table.rowCount()
self.table.insertRow(row)
self.table.setItem(row, 0, QTableWidgetItem(str(query.lastInsertId())))
self.table.setItem(row, 1, QTableWidgetItem(name))
self.table.setItem(row, 2, QTableWidgetItem(phone))
self.table.setItem(row, 3, QTableWidgetItem(email))
self.name_input.setText("")
self.phone_input.setText("")
self.email_input.setText("")
else:
QMessageBox.critical(self, "添加联系人错误", "无法添加联系人")
# 更新联系人
def update_contact(self):
cur_row = self.table.currentRow()
if cur_row < 0:
QMessageBox.warning(self, "警告", "请先选择要更新的联系人")
return
id = int(self.table.item(cur_row, 0).text())
name = self.name_input.text().strip()
phone = self.phone_input.text().strip()
email = self.email_input.text().strip()
if not name or not phone:
QMessageBox.warning(self, "警告", "姓名和手机不能为空")
return
query = QSqlQuery()
query.prepare("UPDATE contacts SET name=:name, phone=:phone, email=:email WHERE id=:id")
query.bindValue(":name", name)
query.bindValue(":phone", phone)
query.bindValue(":email", email)
query.bindValue(":id", id)
if query.exec_():
self.table.setItem(cur_row, 1, QTableWidgetItem(name))
self.table.setItem(cur_row, 2, QTableWidgetItem(phone))
self.table.setItem(cur_row, 3, QTableWidgetItem(email))
self.name_input.setText("")
self.phone_input.setText("")
self.email_input.setText("")
else:
QMessageBox.critical(self, "更新联系人错误", "无法更新联系人")
# 删除联系人
def delete_contact(self):
cur_row = self.table.currentRow()
if cur_row < 0:
QMessageBox.warning(self, "警告", "请先选择要删除的联系人")
return
id = int(self.table.item(cur_row, 0).text())
query = QSqlQuery()
query.prepare("DELETE FROM contacts WHERE id=:id")
query.bindValue(":id", id)
if query.exec_():
self.table.removeRow(cur_row)
else:
QMessageBox.critical(self, "删除联系人错误", "无法删除联系人")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ContactsWindow()
window.show()
sys.exit(app.exec_())
```
注意需要安装PyQt5和PyQt5-sqlite插件,以及SQLite数据库。
我希望这段代码能够解决您的问题。如果您有任何其他问题,请随时提出。
阅读全文