QTableWidget 异常

程序启动时初始化界面,根据数据库查询个数来动态显示QTableWidget行数并添加表头序号;

//设置序号
    nRows = m_pUiSysManagement->tableWidgetUserTable->rowCount();
    for(int idx = 0; idx < nRows; idx++)
    {
        m_pUiSysManagement->tableWidgetUserTable->verticalHeaderItem(idx)->setText(tr("%1").arg(idx+1));
    }
添加一条数据时动态添加一行;

    m_userCount = query.size();
    m_pUiSysManagement->tableWidgetUserTable->setRowCount(m_userCount); //设置行数为数据库中检索出来的用户个数
    for(int idx = 0; idx < (m_pUiSysManagement->tableWidgetUserTable->rowCount()); idx++)
    {
        m_pUiSysManagement->tableWidgetUserTable->verticalHeaderItem(idx)->setText(tr("%1").arg(idx+1));
    }
但这样会在for里添加表头序号是报异常导致程序挂掉!最后测试添加数据时只设置行数,去掉for循环正常了,而且表头序号还会自己添加上,并且证实setRowCount时并没有调用init函数,虽然程序正常了,但还是搞不懂为什么!

QTableWidget 还有一个insertRow(int row)函数,但这是个槽函数,且不能用在多线程中,就没有去研究它。



在PyQt中使用`QTableWidget`显示SQL数据库数据,通常需要以下几个步骤:连接数据库、执行查询、获取查询结果,并将结果填充到`QTableWidget`中。以下是一个完整的实现流程,涵盖数据库连接、查询、数据读取和表格显示。 ### 数据库连接与查询 首先,需要使用数据库连接库(如`pymysql`或`PyQt5.QtSql`模块)连接数据库。以`pymysql`为例,可以使用如下方式建立连接并执行查询: ```python import pymysql from PyQt5.QtWidgets import QTableWidgetItem # 建立数据库连接 database = pymysql.connect( host='localhost', user='tree', password='5201314', db="databasename", charset='utf8', port=3306 ) # 创建游标对象 cur = database.cursor() # 执行SQL查询 cur.execute('SELECT * FROM tablename') # 获取所有数据 rows = cur.fetchall() # 获取记录数和字段数 row_count = cur.rowcount column_count = len(rows[0]) if row_count > 0 else 0 # 关闭数据库连接 cur.close() database.close() ``` ### 将数据填充到QTableWidget 获取到数据后,需要将数据填充到`QTableWidget`中。可以通过循环遍历结果集,并将每个字段插入到表格中。 ```python # 设置表格的行数和列数 self.tableWidget.setRowCount(row_count) self.tableWidget.setColumnCount(column_count) # 填充数据 for i in range(row_count): for j in range(column_count): temp_data = rows[i][j] data_item = QTableWidgetItem(str(temp_data)) self.tableWidget.setItem(i, j, data_item) ``` ### 使用QtSql模块进行数据库操作 除了使用`pymysql`,也可以使用`PyQt5.QtSql`模块进行数据库连接和查询操作。以下是一个使用`QtSql`模块的示例: ```python from PyQt5.QtSql import QSqlDatabase, QSqlQuery from PyQt5.QtWidgets import QTableWidgetItem # 添加数据库连接 db = QSqlDatabase.addDatabase('QMYSQL') db.setHostName('localhost') db.setDatabaseName('databasename') db.setUserName('tree') db.setPassword('5201314') if db.open(): query = QSqlQuery("SELECT * FROM tablename") row = 0 # 获取字段数 column_count = query.record().count() self.tableWidget.setColumnCount(column_count) # 获取结果并填充表格 while query.next(): self.tableWidget.setRowCount(row + 1) for col in range(column_count): item = QTableWidgetItem(str(query.value(col))) self.tableWidget.setItem(row, col, item) row += 1 ``` ### 安全性与性能优化 在实际开发过程中,需要注意以下几点以提高程序的健壮性和性能: - **安全性**:为防止SQL注入攻击,建议使用参数化查询代替直接拼接SQL语句。 - **错误处理**:数据库连接和查询过程中可能会出现异常,应添加异常捕获机制。 - **性能优化**:对于大型数据集,建议采用分页加载机制,避免一次性加载过多数据导致界面卡顿。 ### 示例代码 完整的示例代码如下: ```python import pymysql from PyQt5.QtWidgets import QTableWidgetItem def load_data_to_table(self): try: database = pymysql.connect( host='localhost', user='tree', password='5201314', db="databasename", charset='utf8', port=3306 ) cur = database.cursor() cur.execute('SELECT * FROM tablename') rows = cur.fetchall() row_count = cur.rowcount column_count = len(rows[0]) if row_count > 0 else 0 self.tableWidget.setRowCount(row_count) self.tableWidget.setColumnCount(column_count) for i in range(row_count): for j in range(column_count): temp_data = rows[i][j] data_item = QTableWidgetItem(str(temp_data)) self.tableWidget.setItem(i, j, data_item) cur.close() database.close() except Exception as e: print("数据库操作失败:", e) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值