You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将主窗口的QTableWidget显示到其他窗口?求Python+Qt Creator方案

Python Qt 实现主窗口表格数据同步到子窗口

核心思路

不要直接传递QTableWidget控件实例(易引发父控件归属冲突),而是提取表格的数据内容(行列数、单元格文本、表头),通过参数传递或信号槽机制传给子窗口,由子窗口的QTableWidget重新渲染数据。

完整代码示例

1. 主窗口代码(MainWindow)

from PyQt5.QtWidgets import QMainWindow, QTableWidget, QTableWidgetItem, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import pyqtSignal

class MainWindow(QMainWindow):
    # 自定义信号,用于传递表格数据和表头
    table_data_signal = pyqtSignal(list, list)

    def __init__(self):
        super().__init__()
        self.setWindowTitle("主窗口")
        self.resize(600, 400)

        # 初始化主窗口表格
        self.table_widget = QTableWidget()
        self.init_table_data()

        # 打开子窗口按钮
        self.open_sub_btn = QPushButton("打开子窗口展示表格")
        self.open_sub_btn.clicked.connect(self.open_sub_window)

        # 布局设置
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)
        layout.addWidget(self.table_widget)
        layout.addWidget(self.open_sub_btn)
        self.setCentralWidget(central_widget)

    def init_table_data(self):
        # 模拟填充测试数据
        self.table_widget.setRowCount(3)
        self.table_widget.setColumnCount(2)
        self.table_widget.setHorizontalHeaderLabels(["姓名", "年龄"])

        data = [
            ["张三", "25"],
            ["李四", "30"],
            ["王五", "28"]
        ]

        for row in range(3):
            for col in range(2):
                self.table_widget.setItem(row, col, QTableWidgetItem(data[row][col]))

    def open_sub_window(self):
        # 提取主窗口表格数据
        row_count = self.table_widget.rowCount()
        col_count = self.table_widget.columnCount()
        headers = [self.table_widget.horizontalHeaderItem(col).text() for col in range(col_count)]
        table_data = []
        
        for row in range(row_count):
            row_data = []
            for col in range(col_count):
                item = self.table_widget.item(row, col)
                row_data.append(item.text() if item else "")
            table_data.append(row_data)

        # 创建子窗口并通过信号传递数据
        from sub_window import SubWindow
        self.sub_window = SubWindow()
        self.table_data_signal.connect(self.sub_window.receive_table_data)
        self.table_data_signal.emit(table_data, headers)
        self.sub_window.show()

2. 子窗口代码(SubWindow)

from PyQt5.QtWidgets import QDialog, QTableWidget, QTableWidgetItem, QVBoxLayout

class SubWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("子窗口表格展示")
        self.resize(600, 400)

        self.table_widget = QTableWidget()
        layout = QVBoxLayout()
        layout.addWidget(self.table_widget)
        self.setLayout(layout)

    def receive_table_data(self, table_data, headers):
        # 根据传入的数据填充子窗口表格
        row_count = len(table_data)
        col_count = len(headers) if headers else 0

        self.table_widget.setRowCount(row_count)
        self.table_widget.setColumnCount(col_count)
        self.table_widget.setHorizontalHeaderLabels(headers)

        for row in range(row_count):
            for col in range(col_count):
                self.table_widget.setItem(row, col, QTableWidgetItem(table_data[row][col]))

常见问题排查

  • 信号槽绑定失败:确保信号与槽的参数类型完全匹配,比如自定义信号是pyqtSignal(list, list),槽函数必须接收两个list类型参数。
  • 表格无数据显示:检查主窗口表格数据提取逻辑,注意判断item是否为None(避免空单元格引发报错)。
  • 子窗口布局异常:确认子窗口的QTableWidget已正确添加到布局中,未遗漏布局设置步骤。

内容的提问来源于stack exchange,提问作者Umer Malik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:57:40