【问题标题】:insert dynamic data into QTableWidget将动态数据插入 QTableWidget
【发布时间】:2020-07-24 13:58:30
【问题描述】:

我想用来自用户输入的传入数据填充QTableWidget

这个函数应该“实时”逐行插入每个传入的输入,到目前为止,它同时在所有行中插入输入 我在这里错过了什么?

 @qtc.pyqtSlot(str)
    def add_dynamicdata(self, data):
        row = 0
        col = 0

        for i in range(self.table_widget.rowCount()):
            # insert inputdata in all cells at the same time !
            cell = qtw.QTableWidgetItem(str(data))
            self.table_widget.setItem(row, col, cell)
            row += 1

完整代码

#!/usr/bin/env python

"""


"""

import sys
import threading

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc



class LambdaTableWidget(qtw.QWidget):

    # signals
    core_signal = qtc.pyqtSignal(str)



    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)



        # position
        qtRectangle = self.frameGeometry()
        centerPoint = qtw.QDesktopWidget().availableGeometry().center()
        qtRectangle.moveCenter(centerPoint)
        self.move(qtRectangle.topLeft())
        # size
        self.resize(1400, 710)
        # frame title
        self.setWindowTitle("QTableWidget Test")

        # heading
        heading_label = qtw.QLabel('better then excel')
        heading_label.setAlignment(qtc.Qt.AlignHCenter | qtc.Qt.AlignTop)

        # add Button
        self.setdata_button = qtw.QPushButton("insert data")
        self.test_button = qtw.QPushButton("test feature")




        # table Widget
        self.table_widget = qtw.QTableWidget(5, 1)

        # name colums, rows
        colum_label = ["Weight"]
        row_label = ["row 1", "row 2", "row 3", "row 4", "row 5"]

        self.table_widget.setHorizontalHeaderLabels(colum_label)

        self.table_widget.setVerticalHeaderLabels(row_label)


        # layout
        self.main_layout = qtw.QGridLayout()
        self.main_layout.addWidget(heading_label, 0, 0)
        self.main_layout.addWidget(self.table_widget, 1, 0)
        self.main_layout.addWidget(self.setdata_button, 2, 0)


        self.setLayout(self.main_layout)

        self.show()

        # functionality
        self.setdata_button.clicked.connect(self.start)



    def start(self):
        # starts thread
        # Setting thread.daemon = True will allow the main program to exit before thread is killed.
        threading.Thread(target=self._execute, daemon=True).start()
        self.core_signal.connect(self.add_dynamicdata)


    def _execute(self):
        while True:
            user_input = input("type in: ")
            self.core_signal.emit(user_input) # transmit data

    @qtc.pyqtSlot(str)
    def add_dynamicdata(self, data):
        row = 0
        col = 0

        for i in range(self.table_widget.rowCount()):

            # todo fix the bug !!!
            # insert inputdata in all cells at the same time !
            cell = qtw.QTableWidgetItem(str(data))
            self.table_widget.setItem(row, col, cell)
            row += 1




if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = LambdaTableWidget()
    sys.exit(app.exec_())

【问题讨论】:

  • 我不明白你的疑问在哪里。您正在使用循环遍历表的行数的 for 循环,因此很明显它将用相同的数据填充表。此外,您应该使用 Qt 自己的线程(通过 QThread),因为将它与 Python 的线程混合可能会产生意想不到的结果。最后,如果您希望用户在基于 GUI 的程序中输入,您应该使用基于 GUI 的界面来执行此操作,而不是 input
  • @musicamante 如果行为的原因对您来说很明显,您能否提供解决方案

标签: python pyqt pyqt5 pyqt4


【解决方案1】:
def add_dynamicdata(self, data):
    row = 0
    col = 0

    for i in range(self.table_widget.rowCount()):
        # insert inputdata in all cells at the same time !
        cell = qtw.QTableWidgetItem(str(data))
        self.table_widget.setItem(row, col, cell)
        row += 1

本次比赛的数据不变 所以cell = qtw.QTableWidgetItem(str(data)) 在所有迭代中都保持不变

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2017-02-16
    相关资源
    最近更新 更多