python pyqt5 QTableView连接mysql展示数据Pandas.DataFrame

 QTableView连接mysql展示数据Pandas.DataFrame

根据数据库返回的json数据展示

 效果图:

代码:

import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtCore import QAbstractTableModel, Qt
import pymysql
from pymysql import cursors

#df = pd.DataFrame({'a': ['Mary', 'Jim', 'John'],
#                   'b': [100, 200, 300],
#                   'c': ['a', 'b', 'c']})

class pandasModel(QAbstractTableModel):

    def __init__(self, data):
        QAbstractTableModel.__init__(self)
        self._data = data
        
    def rowCount(self, parent=None):
        return self._data.shape[0]

    def columnCount(self, parnet=None):
        return self._data.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[col]
        return None


class DBManager():

    def __init__(self, conname='default', hostname='127.0.0.1', port='3306', user='root', password='Topevery@2021'):
        self.conname = conname
        self.hostname = hostname
        if port == '':
            port = 3306
        self.port = int(port)
        self.user = user
        self.password = password


    def openDB(self):
        self.db = pymysql.connect(
            host=self.hostname,
            user=self.user,
            password=self.password,
            #database=self.database,
            port=self.port,
            charset='utf8',
            autocommit=True
        )
        return True

    def openDB_json(self):
        self.db = pymysql.connect(
            host=self.hostname,
            user=self.user,
            password=self.password,
            #database=self.database,
            port=self.port,
            charset='utf8',
            cursorclass=cursors.DictCursor,
            autocommit=True
        )
        return True
    
    def getList(self):
        self.openDB_json()
        cur = self.db.cursor(pymysql.cursors.DictCursor)
        cur.execute('select * from mysql.user')
        #cur.execute('select * from information_schema.%s where %s limit 3' % (table,where))
        re = cur.fetchall()

        return re


if __name__ == '__main__':
    app = QApplication(sys.argv)

    my_db = DBManager();
    dataModel = my_db.getList()


    df = pd.DataFrame(dataModel)
    print(df)

    model = pandasModel(df) 
    view = QTableView()
    view.setModel(model)
    view.resize(800, 600)
    view.show()
    sys.exit(app.exec_())

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用QItemDelegate来自定义QTableView中单元格的显示方式,以下是一个示例代码: ```python from PyQt6.QtCore import Qt from PyQt6.QtGui import QStandardItemModel, QStandardItem, QItemDelegate from PyQt6.QtWidgets import QApplication, QTableView, QStyledItemDelegate import pandas as pd class CenterDelegate(QStyledItemDelegate): def initStyleOption(self, option, index): super().initStyleOption(option, index) option.displayAlignment = Qt.AlignmentFlag.AlignCenter if __name__ == "__main__": app = QApplication([]) # 创建一个QTableView tableview = QTableView() # 创建一个QStandardItemModel,并将其设置为tableview的model model = QStandardItemModel() tableview.setModel(model) # 读取数据,创建一个DataFrame data = {"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]} df = pd.DataFrame(data) # 将DataFrame中的数据添加到QStandardItemModel中 for i in range(df.shape[0]): row = [] for j in range(df.shape[1]): item = QStandardItem(str(df.iloc[i, j])) row.append(item) model.appendRow(row) # 设置QTableView中每个单元格的居中显示方式 delegate = CenterDelegate() tableview.setItemDelegate(delegate) # 显示QTableView tableview.show() app.exec() ``` 在这个示例代码中,我们创建了一个名为`CenterDelegate`的自定义`QItemDelegate`类,该类重写了`initStyleOption`方法,将单元格的显示方式设置为居中显示。然后,我们将这个自定义`QItemDelegate`对象设置为`QTableView`中每个单元格的委托,以实现居中显示`DataFrame`数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值