pyqt5“ QTableWidget”和“ setItem”问题

时间:2018-08-06 04:21:55

标签: python pyqt pyqt5 qtablewidget qtablewidgetitem

我想使用QTableWidgetItem,但是出了点问题。 我认为算法如下。

按下底部(“应用”)->更改表小部件项(但什么都没有改变...)

这是我的python代码...请注意注释。

# -*- coding: utf-8 -*-
[..import..]

class UserModel(QStandardItemModel):
    [..item modeling for combobox..]

class Tab_1(QWidget):
    def __init__(self, API, parent=None):
        super(Tab_1, self).__init__(parent=parent)
        self.API = API
        self.ipaddr = []
        self.init_widget()


    def init_widget(self):
        [..GropBox & Layout define..]

        #### ComboBox define
        manufacturer = ["a", "b", "c"]
        combo_model = UserModel(manufacturer)
        combobox = QComboBox()
        combobox.setModel(combo_model)
        combobox.currentTextChanged.connect(self.select_manufacturer)

        [..pushbotton define..]
        pushbottom_list[1].released.connect(self.apply) ## connect Slot


    [..combo box event..]

    #### Push bottom Event
    def apply(self): ## apply button slot
        main = main1()
        print("apply")
        item = ["a", "b", "c", "d", "1", "2"]
        main.table_add_item(item) ## call

主窗口类!

class main1(QMainWindow):
    def __init__(self):
        super(QMainWindow, self).__init__()
        self.initUI()

    def initUI(self):
        [..menuBar define..]

        self.table = QTableWidget(self)
        self.table.setGeometry(0, 21, 300, 700)
        self.table.setRowCount(200)
        self.table.setColumnCount(1)

        self.tbw = QTabWidget(self)
        self.tbw.setGeometry(300,21,400,500)
        self.tbw.addTab(Tab_1("API"), "Search API")

        [..layout define..]

    def status_msg(self, msg):
        self.sb.showMessage(msg)

    def table_add_item(self, item): ## setItem...
        for i in range(len(item)):
            print(item[i]) ## work
            self.table.setItem(i, 0, QTableWidgetItem(item[i])) ## Not Working!!! and nothing changed......

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = main1()
    ex.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

问题很简单,表明您已经忘记了OOP的基本概念:类是一组元素行为的抽象,也就是说,每次使用类创建对象时,该对象都是不同的与上一个版本不同(除了行为已修改)。

对于您来说,是main1类的ex对象:

ex = main1()

不同于:

main = main1()

在上一个命令中,您将创建一个新窗口,该窗口具有其自己的QTableWidget,并将这些值添加到该QTableWidget中。

您会说:如果我要创建一个窗口,为什么不显示它?,首先是因为您没有调用show,其次是因为它是一个局部变量,当它被消除时完成申请。

解决方案很简单,获得原始的main1,为此有几种方法:

  • 使用parent()方法:

    def apply(self): ## apply button slot
        print("apply")
        main =self.parent().parent().parent()
    
        items = ["a", "b", "c", "d", "1", "2"]
        main.table_add_item(items) ## call
    
  • 使用topLevelWidgets()方法:

    def apply(self): ## apply button slot
        main = [w for w in QApplication.topLevelWidgets() if isinstance(w, main1)][0]
        items = ["a", "b", "c", "d", "1", "2"]
        main.table_add_item(items) ## call
    

另一种替代方法是您将该对象显式传递给Tab_1类的构造函数。

最后,可以使table_add_item方法更具可读性

def table_add_item(self, items):
    for i, text in enumerate(items):
        self.table.setItem(i, 0, QTableWidgetItem(text))