pyqt简易通讯录
时间: 2025-05-09 12:22:43 浏览: 15
<think>好的,用户想用PyQt实现一个简易通讯录,需要示例代码或教程。首先,我得回忆一下PyQt的基本组件和数据库操作。用户提供的引用中有涉及界面传参、数据库插入和通讯录的基本功能,比如查询、添加、删除等。
首先,确定通讯录需要哪些功能。根据引用2和3,基本功能包括显示联系人、添加、删除和查询。PyQt中可以用QTableWidget来展示数据,用QLineEdit和QPushButton做输入和操作按钮。
然后考虑数据存储。引用1提到了使用SQLite数据库,比如INSERT INTO语句和executemany方法。所以可能需要创建一个数据库表,包含姓名、电话、地址等字段。使用SQLite可以方便本地存储,不需要额外配置。
接下来是界面设计。主界面可能需要一个表格显示所有联系人,顶部有几个按钮和搜索栏。添加联系人的功能可以通过弹出一个子对话框实现,引用1中的openDialog方法展示了如何打开子窗口并传参。子对话框里放输入框,确定后把数据传回主窗口并插入数据库。
还需要考虑类的结构,比如主窗口继承QMainWindow,子对话框继承QDialog。引用1中的insert_dialog继承main_window类,可能用于数据传递。需要确保子窗口关闭时数据能保存到数据库,并刷新主窗口的表格显示。
代码结构方面,主窗口初始化时要连接数据库,创建表格(如果不存在),然后加载数据到QTableWidget。添加、删除和搜索功能分别绑定到对应的按钮点击事件。搜索功能可以参考引用4,根据输入实时过滤列表,这里可能需要使用QLineEdit的textChanged信号来触发过滤。
测试时要注意输入合法性,比如电话号码是否为数字,引用1中的try-except块处理非法输入,弹出警告框。删除前需要确认,避免误操作,可以用QMessageBox询问用户是否确定。
最后,整合所有功能,确保界面布局合理,信号槽连接正确。可能遇到的问题包括数据库连接失败、数据刷新不及时,或者界面组件布局错乱。需要逐步调试,确保每一步操作都能正确更新界面和数据库。</think>以下是一个基于PyQt5实现的简易通讯录示例代码,包含增删改查功能和数据库存储:
```python
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sqlite3
class ContactDialog(QDialog):
def __init__(self, parent=None, contact=None):
super().__init__(parent)
self.setWindowTitle("联系人详情")
layout = QVBoxLayout()
# 输入控件
self.name_edit = QLineEdit()
self.phone_edit = QLineEdit()
self.address_edit = QLineEdit()
# 初始化数据(编辑模式)
if contact:
self.name_edit.setText(contact[0])
self.phone_edit.setText(contact[1])
self.address_edit.setText(contact[2])
# 表单布局
form = QFormLayout()
form.addRow("姓名:", self.name_edit)
form.addRow("电话:", self.phone_edit)
form.addRow("地址:", self.address_edit)
# 按钮
btn_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
btn_box.accepted.connect(self.accept)
btn_box.rejected.connect(self.reject)
layout.addLayout(form)
layout.addWidget(btn_box)
self.setLayout(layout)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("通讯录管理系统")
self.setGeometry(300, 300, 600, 400)
# 初始化数据库
self.init_db()
# 主界面布局
main_widget = QWidget()
self.setCentralWidget(main_widget)
layout = QVBoxLayout()
# 搜索栏
self.search_edit = QLineEdit()
self.search_edit.setPlaceholderText("输入姓名搜索...")
self.search_edit.textChanged.connect(self.load_data)
# 操作按钮
btn_add = QPushButton("添加联系人")
btn_add.clicked.connect(self.add_contact)
btn_del = QPushButton("删除选中")
btn_del.clicked.connect(self.delete_contact)
# 表格控件
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(["姓名", "电话", "地址"])
self.table.setSelectionBehavior(QTableWidget.SelectRows)
# 布局组合
top_layout = QHBoxLayout()
top_layout.addWidget(self.search_edit)
top_layout.addWidget(btn_add)
top_layout.addWidget(btn_del)
layout.addLayout(top_layout)
layout.addWidget(self.table)
main_widget.setLayout(layout)
self.load_data()
def init_db(self):
self.conn = sqlite3.connect("contacts.db")
self.cursor = self.conn.cursor()
# 创建表结构
self.cursor.execute("""
CREATE TABLE IF NOT EXISTS contacts (
name TEXT PRIMARY KEY,
phone TEXT,
address TEXT
)
""")
self.conn.commit()
def load_data(self):
search_text = self.search_edit.text().strip()
query = "SELECT * FROM contacts WHERE name LIKE ?"
self.cursor.execute(query, ('%'+search_text+'%',))
contacts = self.cursor.fetchall()
self.table.setRowCount(len(contacts))
for row, contact in enumerate(contacts):
for col, value in enumerate(contact):
item = QTableWidgetItem(str(value))
item.setFlags(item.flags() ^ Qt.ItemIsEditable)
self.table.setItem(row, col, item)
def add_contact(self):
dialog = ContactDialog(self)
if dialog.exec_() == QDialog.Accepted:
try:
self.cursor.execute("""
INSERT INTO contacts VALUES (?, ?, ?)
""", (dialog.name_edit.text(),
dialog.phone_edit.text(),
dialog.address_edit.text()))
self.conn.commit()
self.load_data()
except sqlite3.IntegrityError:
QMessageBox.warning(self, "错误", "该姓名已存在!")
def delete_contact(self):
selected = self.table.selectedItems()
if not selected:
return
row = selected[0].row()
name = self.table.item(row, 0).text()
reply = QMessageBox.question(
self, "确认删除",
f"确定要删除 {name} 吗?",
QMessageBox.Yes | QMessageBox.No)
if reply == QMessageBox.Yes:
self.cursor.execute("DELETE FROM contacts WHERE name=?", (name,))
self.conn.commit()
self.load_data()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
阅读全文
相关推荐














