基于来自DB的信号的实时更新QTableView(SQLITE)

问题描述 投票:0回答:1

我有一个非常基本的PySide2程序,该程序将数据集库用于sqlite。

我非常简单的布局文件是

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'basic.ui'
##
## Created by: Qt User Interface Compiler version 5.14.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
    QObject, QPoint, QRect, QSize, QTime, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
    QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
    QPixmap, QRadialGradient)
from PySide2.QtWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.resize(1034, 803)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.tableWidget = QTableWidget(self.centralwidget)
        if (self.tableWidget.columnCount() < 2):
            self.tableWidget.setColumnCount(2)
        __qtablewidgetitem = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
        __qtablewidgetitem1 = QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
        self.tableWidget.setObjectName(u"tableWidget")
        self.tableWidget.setGeometry(QRect(40, 20, 981, 401))
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setObjectName(u"pushButton")
        self.pushButton.setGeometry(QRect(930, 430, 89, 25))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)

        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
        ___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0)
        ___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"Name", None));
        ___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1)
        ___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"Gender", None));
        self.pushButton.setText(QCoreApplication.translate("MainWindow", u"PushButton", None))
    # retranslateUi


我的主文件是

import os

import dataset
from PySide2 import QtWidgets
from PySide2.QtWidgets import QTableWidgetItem

from layouts.basic import Ui_MainWindow

# delete DB to test
try:
    os.remove("data.db")
except:
    pass


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow) :
    def __init__(self, parent=None) :
        super(MainWindow, self).__init__()

        self.setupUi(self)
        self.showMaximized()

        self.pushButton.pressed.connect(self.upsert)


    def upsert(self):
        db = dataset.connect('sqlite:///data.db')
        table = db['abc']
        for i in range(10):
            table.insert(dict(name='Jane', age=34, gender='female'))

        self.results()

    def results(self) :
        db = dataset.connect('sqlite:///data.db')
        self.tableWidget.setRowCount(0)
        for value in db["abc"] :
            name = value['name']
            gender = value['gender']
            print(gender)

            rowPosition = self.tableWidget.rowCount()
            self.tableWidget.insertRow(rowPosition)
            # self.tableWidget.setSizeAdjustPolicy(
            #     QtWidgets.QAbstractScrollArea.AdjustToContents)
            # self.tableWidget.resizeColumnsToContents()

            self.tableWidget.setItem(rowPosition, 0, QTableWidgetItem(name))
            self.tableWidget.setItem(rowPosition, 1, QTableWidgetItem(gender))


if __name__ == "__main__" :
    app = QtWidgets.QApplication([])
    main_window = MainWindow()
    main_window.show()
    app.exec_()

您可以看到,按钮上的主文件创建了一个数据库,写了一个表叫abc并插入一些值直到10行。完成此操作后,它将调用结果函数并更新表。

现在假定已将数据实时写入此数据库,并且每秒不断更新行。

我想

  1. 当第一行数据可用时通知结果功能
  2. 随着数据可用而不是在数据加载完成之后,更新QtableView。

我将如何做?

python sqlite dataset qtableview pyside2
1个回答
0
投票

所以这就是我的解决方法。

我实现了一个非常简单的QFileSystemWatcher as

    w = MainWindow()
    paths = ['data.db']
    fs_watcher = QFileSystemWatcher(paths)
    fs_watcher.fileChanged.connect(w.file_changed)

其中w是我的MainWindow类。

现在,文件实时更新后,QfilesystemWatcher通知了file_changed类,所以

    def file_changed(self) :
        ---Your Logic Here

这为我解决了。

© www.soinside.com 2019 - 2024. All rights reserved.