PyQT5實現QTableWidget自定義分頁

需求分析: 在做一個界面工具的時候, 由於需要用QTableWidget顯示查詢數據庫返回的內容, 但數據庫返回內容較多, QTableWidget沒有自帶分頁功能, 且界面一下顯示過多內容會出現卡頓, 所以自己實現一個分頁解決問題..

思路分析: 需要做兩個按鈕實現翻頁, 一個功能爲上一頁, 一個功能爲下一頁; 需要兩個標籤, 一個顯示當前頁數, 一個顯示總頁數. 爲實現複用, 可以把幾個控件封裝爲一個類.這個類有以下幾個功能:

1, 傳入兩個參數, 一個是數據總的長度, 一個是每一頁顯示的長度, 即將來的表格需要顯示多少條數據, 每一頁顯示幾行.

2, 兩個按鈕點擊後觸發兩個功能, 一個是刷新分頁導航欄的頁數顯示, 一個是刷新表格上的內容顯示.

具體實現與說明:

class IndexBar:
    def __init__(self, parent):
        self.index_bar = QWidget(parent)
        self.index_bar.setFixedSize(130, 35)
        self.layout = QHBoxLayout()
        self.index_bar.setLayout(self.layout)
        self.layout.addStretch()
        self.btn_left = QPushButton('<<')
        self.btn_left.setStyleSheet("QPushButton{border:0;font-size:16px}QPushButton::hover{background-color:green}")
        self.layout.addWidget(self.btn_left)
        self.label_page = QLabel('1')
        self.label_page.setStyleSheet("font-size:14px;")
        self.layout.addWidget(self.label_page)
        self.btn_right = QPushButton('>>')
        self.btn_right.setStyleSheet("QPushButton{border:0;font-size:16px}QPushButton::hover{background-color:green}")
        self.layout.addWidget(self.btn_right)
        self.layout.addStretch()
        self.label_all = QLabel('共1頁')
        self.label_all.setStyleSheet("font-size:14px;")
        self.layout.addWidget(self.label_all)

        self.current_page = 1
        self.all_page = 1
        self.lenth = 1
        self.num = 1

    def set_page_num(self, lenth, num):
        self.lenth = lenth
        self.num = num
        if lenth % num == 0:
            self.all_page = lenth // num
        else:
            self.all_page = lenth // num + 1
        self.refresh_page_info()

    def refresh_page_info(self):
        self.label_all.setText('共' + str(self.all_page) + '頁')
        self.label_page.setText(str(self.current_page))

    def get_index(self, index):
        if index < self.all_page:
            return self.num * (index - 1), self.num * index - 1
        elif index == self.all_page:
            return self.num * (index - 1), self.lenth - 1
        else:
            return 0, 0

 

1, 顯示效果如下:

2, 首先定義需要的各個控件, 其中兩個翻頁按鍵通過QPushButton定義, 鼠標懸浮變爲綠色, 頁數顯示爲QLabel.

3, 定義方法, 根據數據總數和每一頁顯示數計算總頁數; 根據當前頁數判斷需要顯示數據的索引值, 即從第幾條到第幾條; 刷新界面顯示當前頁和總頁數的內容.

4, 還需要定義按鈕的連接方法來實現功能, 可以在需要實現分頁功能的位置設置, 然後分別實現相應的函數功能.

self.XXXXXXX.btn_left.clicked.connect(self.XXXXXX_left)
self.XXXXXXX.btn_right.clicked.connect(self.XXXXXX_right)

5, 功能擴展: 顯示可以繼續優化爲更好看的設計, 可以將頁數顯示改爲QLineEdit控件, 實現手動輸入頁數來跳轉到固定頁. 還可以加入直接跳轉到首頁尾頁功能, 還可以顯示爲兩邊數字中間省略號動態調整頁數.

6, 其它說明: 這只是一個簡單的示例, 也算是從無到有的一個過程, 在之後的應用中可以將其不斷優化.定義的class沒有直接繼承QWidget, 修改以下即可, 這一點需要注意, 實現的過程中代碼的防護等內容根據需要修改就可以了.

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