PyQt5实例:在主窗口中显示自定义表格控件

问题

用QTableWidget方式自定义了1个MyTable类以表格显示数据,开始在MainWindow主窗口加入myTable 实例 ,但无法显示出来

原因:

后来发现MyTable中使用了布局,在主窗口中实例化后,如果将其加入主窗口的布局,无法显示

解决方法

为MyTable object生成1个布局,将主窗口的控件,也加入到MyTable 布局,将myTable设置为主窗口的central widget ,

完整代码如下

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *


class Mytable(QWidget):
    def __init__(self) -> None:
        super(Mytable, self).__init__()
        self.setGeometry(400, 200, 1200, 600)
        self.tables()
        self.initUI()

    def tables(self):
        # 创建tableWidget,设置行、列数
        self.tbwidget = QTableWidget()
        self.tbwidget.setRowCount(3)
        self.tbwidget.setColumnCount(4)

        # 设置表格属性
        # 调整列和行的大小
        self.tbwidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.tbwidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
        # 垂直表头不显示
        self.tbwidget.verticalHeader().setVisible(False)

        # 隐藏滚动条
        self.tbwidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.tbwidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        # set table header
        list_title = ['Name', 'Gender', 'age', 'Deptment']
        self.tbwidget.setHorizontalHeaderLabels(list_title)

        # Give data to cells of 1st row
        self.tbwidget.setItem(0, 0, QTableWidgetItem("John"))
        self.tbwidget.setItem(0, 1, QTableWidgetItem("男"))
        self.tbwidget.setItem(0, 2, QTableWidgetItem("24"))
        self.tbwidget.setItem(0, 3, QTableWidgetItem("销售部"))
        # Give data to cells of 2nd row
        self.tbwidget.setItem(1, 0, QTableWidgetItem("Mary"))
        self.tbwidget.setItem(1, 1, QTableWidgetItem("女"))
        self.tbwidget.setItem(1, 2, QTableWidgetItem("29"))
        self.tbwidget.setItem(1, 3, QTableWidgetItem("财务部"))
        # Give data to cells of 3rd row
        self.tbwidget.setItem(2, 0, QTableWidgetItem("王勇"))
        self.tbwidget.setItem(2, 1, QTableWidgetItem("男"))
        self.tbwidget.setItem(2, 2, QTableWidgetItem("30"))
        self.tbwidget.setItem(2, 3, QTableWidgetItem("运营部"))

    def initUI(self):
        # Create layout elements
        self.vbox_0 = QVBoxLayout()
        self.vbox_1 = QVBoxLayout()
        self.hbox_1 = QHBoxLayout()

        # set vbox_1 layout
        self.vbox_1.addWidget(self.tbwidget)

        # set hbox_1 layer
        label_1 = QLabel('OK')
        label_2 = QLabel('Cancel')
        self.hbox_1.addWidget(label_1, alignment=Qt.AlignCenter)
        self.hbox_1.addWidget(label_2, alignment=Qt.AlignCenter)

        # set base layout vbox_0
        self.vbox_0.addLayout(self.vbox_1)
        self.vbox_0.addLayout(self.hbox_1)

        # Apply vobox_0 into mainWindow
        self.setLayout(self.vbox_0)


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.init_gui()
        self.setGeometry(400, 150, 800, 300)

    def init_gui(self):
        """主窗口显示自定义MyTable Widget
        Notice: 
            不能使用主窗口layout, 否则 table 显示不出来
        Stpes:
            (1) 创建 mytable 实例, 用 setCentralWidgets 设置为窗口的中心控件
            (2) 创建 布局变量,分配给 mytable
            (3) 创建 主窗口的控件,加入 layout 
            (4) mainwindow 不需要指定布局方式,由 myTable完成
        """
        self.mytable = Mytable()
        self.layout = QVBoxLayout()
        self.setCentralWidget(self.mytable)
        self.mytable.setLayout(self.layout)

        self.textbox = QLineEdit('please into text')
        self.echo_label = QLabel('评论')
        self.echo_label.setBuddy(self.textbox)

        # 将窗口控件加入 mytable 的布局
        self.hbox_win = QHBoxLayout()
        self.hbox_win.addWidget(
            self.echo_label)
        self.hbox_win.addWidget(
            self.textbox)
        self.mytable.layout().addLayout(self.hbox_win)

        # self.mytable.layout().addWidget(self.echo_label)
        # self.mytable.layout().addWidget(self.textbox)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())



```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值