簡體   English   中英

如何在 QGroupBox 中添加 QTableView

[英]How to add QTableView inside a QGroupBox

我正在尋找有關如何在 QGroupBox 中添加 QTableView 的幫助(這是因為我需要創建 4 個 QTableView,每個 QTableView 顯示每個可能的狀態之一“正在 QC”、“准備進行 QC”、“進行中”、“待定” ')。

以下代碼當前生成一個顯示單個 QTableView 的程序,該程序每 5 秒刷新一次新數據,唯一重要的是狀態(當前表示為 F 列),因為顯示其余數據以供識別。 (請注意,在此示例中,我使用了自動生成數據以顯示在 QTableView 中的代碼,因為此表實際上是從 Excel 文件中獲取的,因此將在本文末尾附上讀取 Excel 文件的代碼):

import sys
import pandas as pd

from PyQt5.QtCore import pyqtSignal, pyqtSlot, QAbstractTableModel, QObject, Qt
from PyQt5.QtGui import QBrush
from PyQt5.QtWidgets import QApplication, QTableView

import threading


class PandasManager(QObject):
    dataFrameChanged = pyqtSignal(pd.DataFrame)

    def start(self):
        self.t = threading.Timer(0, self.load)
        self.t.start()

    def load(self):
        import random

        headers = list("ABCDEFG")
        data = [random.sample(range(255), len(headers)) for _ in headers]

        for d in data:
            d[5] = random.choice(["Ready for QC", "In Progress", "Pending", "In QC"])

        df = pd.DataFrame(data, columns=headers,)

        self.dataFrameChanged.emit(df)
        self.t = threading.Timer(5.0, self.load)
        self.t.start()

    def stop(self):
        self.t.cancel()


class PandasModel(QAbstractTableModel):
    def __init__(self, df=pd.DataFrame()):
        QAbstractTableModel.__init__(self)
        self._df = df

    @pyqtSlot(pd.DataFrame)
    def setDataFrame(self, df):
        self.beginResetModel()
        self._df = df
        self.endResetModel()

    def rowCount(self, parent=None):
        return self._df.shape[0]

    def columnCount(self, parent=None):
        return self._df.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.BackgroundRole:
                if self.columnCount() >= 6:
                    it = self._df.iloc[index.row(), 5]
                    if it == "Ready for QC":
                        return QBrush(Qt.yellow)
                    if it == "In Progress":
                        return QBrush(Qt.green)
            if role == Qt.DisplayRole:
                return str(self._df.iloc[index.row(), index.column()])

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._df.columns[col]
        return None


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QTableView()
    model = PandasModel()
    w.setModel(model)
    w.show()

    manager = PandasManager()
    manager.dataFrameChanged.connect(model.setDataFrame)
    manager.start()

    ret = app.exec_()

    manager.stop()

    sys.exit(ret)

程序目前的樣子

希望這能解釋我的問題,因為我一直在努力研究如何使用 QGroupBox 以及如何添加 QTableView,因為我正在以這種方式使用它。

親切的問候,

PS:附上從excel文件中讀取的代碼

def load(self):
    weekNumber = date.today().isocalendar()[1]
    aux = pd.read_excel("PCS tasks 2020.xlsm", sheet_name="W" + str(weekNumber))
    today = datetime.today()
    df = aux[aux["Date Received"] == today.strftime("%Y-%d-%m")]
    df = df[
        [
            "Requestor",
            "Subject",
            "Task type",
            "Created by",
            "QC Executive",
            "Status",
        ]
    ].fillna("")
    df = df[df["Status"] != "Completed"]
    self.dataFrameChanged.emit(df)
    self.t = threading.Timer(5.0, self.load)
    self.t.start()

正如QGroupBox 文檔的示例所示,您必須使用允許您分發小部件(QGridLayout、QHBoxLayout、QVBoxLayout 等)的布局並將其設置在 QGroupBox 中:

if __name__ == "__main__":
    app = QApplication(sys.argv)

    w = QTableView()
    model = PandasModel()
    w.setModel(model)

    groupbox = QGroupBox() lay = QVBoxLayout() lay.addWidget(w) groupbox.setLayout(lay) groupbox.show()

    manager = PandasManager()
    manager.dataFrameChanged.connect(model.setDataFrame)
    manager.start()

    ret = app.exec_()

    manager.stop()

    sys.exit(ret)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM