PyQt项目实战-工作小助手(3 利用QSqlQuery和tableWidget 实现工作台)

PyQt项目实战-工作小助手(3 利用QSqlQuery和tableWidget 实现工作台)

项目的工作台需展示当前待办事项的总体情况和需求状态总体情况,作为首页,能够一目了然当期手工主要工作进展。

文章目录

  • PyQt项目实战-工作小助手(3 利用QSqlQuery和tableWidget 实现工作台)
    • 1、功能需求
    • 2、数据库设计
    • 3、界面设计
    • 4、功能代码
      • 1、获取和展示待办事项数据统计。
      • 2、获取和展示需求情况数据统计。

1、功能需求

  1. 实时更新查询待办事项的完成情况,包括已完成数量、未完成数量、待办事项总数
  2. 实时更新查询需求的总体情况,按照涉及的系统和需求的进展阶段二维统计

2、数据库设计

项目相对简单,直接使用python自带的sqlite3数据库。

  1. 链接数据库database.db
import sqlite3
conn = sqlite3.connect('database.db')

如果数据库database.db不存在,则会自动在当前目录创建一个。

  1. 建立待办事项表todolist和需求情况表require,重点在 “IF NOT EXISTS”。
import sqlite3

def create_table():
    conn=sqlite3.connect("test.db")
    c=conn.cursor()
    create_todolist='''CREATE TABLE IF NOT EXISTS todolist
        (listid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            catalog integer NOT NULL DEFAULT 1,
            content TEXT NOT NULL,
            finstatus integer NOT NULL ON CONFLICT FAIL,
            pdate TEXT NOT NULL,
            fdate TEXT,
            frecord TEXT,
            plan TEXT)'''
    create_require='''CREATE TABLE IF NOT EXISTS require
       ("reqid" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
		"sysrelated" integer NOT NULL,
		"ideadate" TEXT NOT NULL,
		"source" TEXT NOT NULL,
		"title" TEXT NOT NULL,
		"content" TEXT,
		"catagory" integer NOT NULL,
		"developer" TEXT,
		"priority" integer,
		"status" integer NOT NULL,
		"posdate" TEXT,
		"edate" TEXT,
		"fdate" TEXT,
		"memo" TEXT)'''

    c.execute(create_todolist)
    c.execute(create_require)

    conn.commit()
    conn.close()
  1. 另外一种方式,用QSqlDatabase来创建数据库和表
from PyQt5.QtSql import QSqlDatabase,QSqlQuery

db = QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('test2.db')
if not db.open():
    db.open()
query=QSqlQuery(db)
create_todolist='''CREATE TABLE IF NOT EXISTS todolist
        (listid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            catalog integer NOT NULL DEFAULT 1,
            content TEXT NOT NULL,
            finstatus integer NOT NULL ON CONFLICT FAIL,
            pdate TEXT NOT NULL,
            fdate TEXT,
            frecord TEXT,
            plan TEXT)'''
query.prepare(create_todolist)
query.exec_()
db.commit()
db.close()

3、界面设计

PyQt项目实战-工作小助手(3 利用QSqlQuery和tableWidget 实现工作台)_第1张图片

1、界面图标均来自于网络,推荐使用(https://www.iconfont.cn/)

2、待办事项,用的是grid布局,用三个图标和三个label分别表示未完成、已完成和总数量。

3、需求统计使用的是QTableView控件。

4、功能代码

1、获取和展示待办事项数据统计。

这里需要获取todolist表中总记录数、已完成状态记录数和未完成状态记录数,然后分别显示在三个label文字中。

1、SELECT COUNT(*) FROM table_name where用于返回表中符合Where条件的记录数。Sql count() 函数各项功能总结如下

  • COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)
  • COUNT(*) 函数返回表中的记录数
  • COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目

2、执行完query.exec_()后返回结果集,但是这时指针是指向结果集外面的,所以要使用query.next()去指向第一条记录,也可以使用query.seek(0),并通过query.value(0)获取第一条记录中的第1个属性值,也就是我们需要的统计值。

结果集其实就是查询到的所有记录的集合,在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的操作有:
seek(int n) :query指向结果集的第n条记录;
first() :query指向结果集的第一条记录;
last() :query指向结果集的最后一条记录;
next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;
previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;
record() :获得现在指向的记录;
value(int n) :获得属性的值。其中n表示你查询的第n个属性,返回的是QVariant类型的数据。
at() :获得现在query指向的记录在结果集中的编号。

3、使用Qlabel的setText()方法,将查询获取的数据分别展示在三个label上。注意需要先转换为str。

4、具体代码如下:

	'''
    0 工作台数据显示
    '''

    def gettodosum(self):  # 待办事项统计
        if not db.open():
            db.open()
        query = QSqlQuery()
        query.exec_('select count(*) from todolist')
        query.next()
        total = query.value(0)  # 获取待办事项记录总数
        query1 = QSqlQuery()
        query1.exec_('select count(*) from todolist where finstatus=1')
        query1.next()
        unfinish = query1.value(0)  # 获取未完成待办事项记录数
        query2 = QSqlQuery()
        query2.exec_('select count(*) from todolist where finstatus=2')
        query2.next()
        finish = query2.value(0)  # 获取已完成待办事项记录数
        self.total.setText(str(total))
        self.unfinish.setText(str(unfinish))
        self.finish.setText(str(finish))

2、获取和展示需求情况数据统计。

这里需要获取require表中按需求进度和系统分别统计的记录数,然后展示在tablewidget中。

1、设置tablewidget的行数和列数、行标题和列标题、设置不允许修改。

2、使用两个for循环嵌套来获取符合条件的记录数。其中第一行和第一列是分类汇总值。

3、使用tablewidget.setItem()函数循环添加Item。

    def getreqsum(self):  # 需求统计,按照需求状态和相关渠道统计
        if not db.open():
            db.open()

        self.tableWidget_req.setColumnCount(len(statuslist))  # 列数
        self.tableWidget_req.setRowCount(len(syslist))  # 行数
        self.tableWidget_req.setHorizontalHeaderLabels(statuslist)  # 列标题
        self.tableWidget_req.setVerticalHeaderLabels(syslist)  # 行标题
        self.tableWidget_req.setEditTriggers(QTableWidget.NoEditTriggers)  # 不允许修改
        	self.tableWidget_req.horizontalHeader().setStyleSheet("QHeaderView::section{background:grey;}")  # 设置标题背景
        self.tableWidget_req.verticalHeader().setStyleSheet("QHeaderView::section{background:grey;}")
        for i in range(len(syslist)):
            row = []
            for j in range(len(statuslist)):
                query = QSqlQuery()
                if i == 0 and j == 0:
                    query.exec_('select count(*) from require')
                elif i == 0 and j > 0:
                    query.exec_('select count(*) from require where status={}'.format(j))
                elif i > 0 and j == 0:
                    query.exec_('select count(*) from require where sysrelated={}'.format(i))
                else:
                    query.exec_('select count(*) from require where sysrelated={} and status={}'.format(i, j))
                query.next()
                # print(query.value(0))
                item = QTableWidgetItem(str(query.value(0)))
                item.setTextAlignment(Qt.AlignCenter)
                if i == 0 or j == 0:
                    item.setFont(QFont('Times', 12, QFont.Black))  # 设置第一行和第一列字体大小和加粗
                self.tableWidget_req.setItem(i, j, item)

你可能感兴趣的:(python学习)