# Time: 2020/05/17
#Author: Xiaohong
# 運行環境: OS: Windows 7
# Python: 3.7
# 功能: 從sqilite3 DB 中取出數據,顯示在QTable Widget 中
運行後的界面如下:
主界面腳本如下:
import sys
import sqlite3
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore, QtWidgets
# from PyQt5.QtWidgets import QTableWidget, QProgressBar, QLineEdit, QComboBox, QFrame, QTableWidgetItem
from PyQt5.QtCore import *
from PyQt5.QtGui import *
# 這個test_pyqt是ui文件對應的py文件的文件名
from Ui_test02 import Ui_test_form1
# 我的Form是用的QWidget作爲基類
# 全局字體
light_10_font = QtGui.QFont()
light_10_font.setFamily("微軟雅黑 Light")
light_10_font.setPointSize(10)
light_10_font.setBold(False)
light_10_font.setWeight(50)
light_12_font = QtGui.QFont()
light_12_font.setFamily("微軟雅黑 Light")
light_12_font.setPointSize(12)
light_12_font.setBold(False)
light_12_font.setWeight(50)
class MyWindow(QWidget, Ui_test_form1):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.SetDailyTableColumns()
self.btn_read.clicked.connect(self.p_readData) #按鈕對應的 函數
def SetDailyTableColumns(self):
rtn_desc, rtn_prop = self.select_prop() # 取得數據
col_len = len(rtn_prop[0]) # 取得返回結果的 列數
#TW_01 是 Qtable Widget 對象
self.TW_01.setColumnCount(col_len) # 設置列數
self.TW_01.setRowCount(len(rtn_prop)) # 設置共有幾行
self.TW_01.setEditTriggers(QAbstractItemView.NoEditTriggers) # 設置 表格內容 不允許更改
for i in range(len(rtn_desc)): # 設置標題
item_header= QtWidgets.QTableWidgetItem(rtn_desc[i][0])
item_header.setFont(light_12_font) #設置標題的 字體
item_header.setTextAlignment(QtCore.Qt.AlignCenter) #設置中間對齊
self.TW_01.setHorizontalHeaderItem(i, item_header)
# 設置 內容
for row in range(len(rtn_prop)): # 設置行
for col in range(len(rtn_prop[row])): # 設置列
Item_value = QtWidgets.QTableWidgetItem(
str(rtn_prop[row][col])) # 格式化值
Item_value.setFont(light_10_font) #設置內容的 字體
Item_value.setTextAlignment(QtCore.Qt.AlignLeft) #設置左對齊
self.TW_01.setItem(row, col, Item_value) # 設置值
# self.TW_01.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) #本意是設置按內容自適應寬度,待驗證
# 設置 標題 的樣式
self.TW_01.horizontalHeader().setStyleSheet(
"QHeaderView::section{background-color:lightblue;color: black;padding-left: 4px;border: 1px solid#6c6c6c;}")
self.TW_01.verticalHeader().setHidden(False) # 顯示行號
# Item_2 = QtWidgets.QTableWidgetItem('Row2') # 格式化值
# self.TW_01.verticalHeader().setVerticalHeaderItem(2, item) #本意是設置 行頭的 標題,待驗證
# 以下可用,但本案例沒有使用到
# self.TW_01.verticalHeader().setHidden(True) #隱藏行號方法
# self.TW_01.horizontalHeader().hide() #隱藏列頭方法
# self.TW_01.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeToContents); #設置第6列要根據內容使用寬度的列
# self.TW_01.horizontalHeader().resizeSection(0, 200) # 調整第一列的大小爲100像素
def p_readData(self):
print('data')
# self.TW_01.setCurrentCell(1, 1, QItemSelectionModel.Select) #設置讓 第二行,第二列 選中
self.TW_01.setCurrentCell(1,0, QItemSelectionModel.Select) #設置讓 第二行 整行 選中
def select_prop(self):
# 連接Sqlite 數據庫
try:
database=sqlite3.connect("rasppi01.db")
cursor=database.cursor()
sql="select pi_name,pi_ip,clam,bug_cnt,scan_date,main_date,daily_date,engine_ver,known_virus,pi_cpu_serial,sys_date from pi_prop order by pi_name"
cursor.execute(sql)
data_desc=cursor.description
data_value=cursor.fetchall()
print(data_value)
except:
import sys
tuple=sys.exc_info()
errmsg=' Failure querying pi_prop ,'+' Error:'+str(tuple[1])
print(errmsg)
# tkinter.messagebox.showerror(title='Failure ', message=errmsg)
finally:
database.close()
# print(data_value)
return data_desc, data_value
if __name__ == "__main__":
app=QApplication(sys.argv)
w=MyWindow()
w.resize(900, 300)
w.show()
sys.exit(app.exec_())
用QT5 製作出的test02.UI 腳本如下:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>test_form1</class>
<widget class="QWidget" name="test_form1">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>857</width>
<height>345</height>
</rect>
</property>
<property name="windowTitle">
<string>Tests...</string>
</property>
<widget class="QPushButton" name="btn_read">
<property name="geometry">
<rect>
<x>110</x>
<y>30</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Read Data</string>
</property>
</widget>
<widget class="QTableWidget" name="TW_01">
<property name="geometry">
<rect>
<x>20</x>
<y>90</y>
<width>801</width>
<height>201</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>btn_read</sender>
<signal>clicked()</signal>
<receiver>test_form1</receiver>
<slot>p_readData()</slot>
<hints>
<hint type="sourcelabel">
<x>145</x>
<y>46</y>
</hint>
<hint type="destinationlabel">
<x>311</x>
<y>58</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>p_readData()</slot>
</slots>
</ui>