[pyqt5]在表格控件中添加“删除“按钮,当点击“删除“时会删除对应行的数据,且刷新表格!

代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QPushButton, QVBoxLayout, QWidget
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.data_lst = ['cam', 'cpu', 'mem', 'demo']  # 数据列表
        # 创建表格控件
        self.tableWidget = QTableWidget()
        self.tableWidget.setColumnCount(2)  # 设置列数,多加一列用于放置删除按钮
        self.tableWidget.setHorizontalHeaderLabels(['Data', ''])  # 设置表头
        # 创建布局并将表格控件添加到布局中
        layout = QVBoxLayout()
        layout.addWidget(self.tableWidget)
        # 创建主窗口,并将布局设置为主窗口的中央部件
        centralWidget = QWidget()
        centralWidget.setLayout(layout)
        self.setCentralWidget(centralWidget)
        # 渲染数据
        self.renderData()
    def renderData(self):
        self.tableWidget.setRowCount(len(self.data_lst))  # 设置行数
        for row, data in enumerate(self.data_lst):
            item = QTableWidgetItem(data)
            self.tableWidget.setItem(row, 0, item)
            # 创建按钮并放置到表格中
            deleteButton = QPushButton('Delete')
            self.tableWidget.setCellWidget(row, 1, deleteButton)
            # 绑定按钮的点击事件
            deleteButton.clicked.connect(lambda _, r=row: self.deleteRow(r))
    def deleteRow(self, row):
        if row < self.tableWidget.rowCount():  # 检查索引是否有效
            self.tableWidget.removeRow(row)
            del self.data_lst[row]  # 同时删除data_lst中对应的元素
        self.renderData()  # 更新表格数据
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

<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_()) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值