QT5 練習之QTable Widget

# 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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章