pyqt5 "QTableWidget" 和 "setItem" 问题
pyqt5 "QTableWidget" and "setItem" issue
我想使用 QTableWidgetItem 但是出了点问题..
我觉得算法如下
下推("apply") -> 更改Table 小部件项目(但没有任何变化...)
这里是我的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
主要windowclass!!
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_())
问题很简单,说明你忘记了OOP的基本概念:classes是对一组元素行为的抽象,即每次使用class 创建一个对象,那个对象和之前的对象不一样(除了修改了行为)。
在你的例子中,class main1 的 ex 对象:
ex = main1()
不同于:
main = main1()
在前面的命令中你正在创建一个新的window,而那个window有它自己的QTableWidget,你正在将那些值添加到那个QTableWidget。
你会说:如果我正在创建一个window为什么它没有显示?,首先是因为你没有调用show,其次是因为它是一个局部变量,当它执行完apply时被淘汰。
解决方法很简单,得到原来的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
另一种替代方法是将该对象显式传递给 class Tab_1.
的构造函数
最后,table_add_item 方法可以变得更具可读性
def table_add_item(self, items):
for i, text in enumerate(items):
self.table.setItem(i, 0, QTableWidgetItem(text))
我想使用 QTableWidgetItem 但是出了点问题.. 我觉得算法如下
下推("apply") -> 更改Table 小部件项目(但没有任何变化...)
这里是我的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
主要windowclass!!
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_())
问题很简单,说明你忘记了OOP的基本概念:classes是对一组元素行为的抽象,即每次使用class 创建一个对象,那个对象和之前的对象不一样(除了修改了行为)。
在你的例子中,class main1 的 ex 对象:
ex = main1()
不同于:
main = main1()
在前面的命令中你正在创建一个新的window,而那个window有它自己的QTableWidget,你正在将那些值添加到那个QTableWidget。
你会说:如果我正在创建一个window为什么它没有显示?,首先是因为你没有调用show,其次是因为它是一个局部变量,当它执行完apply时被淘汰。
解决方法很简单,得到原来的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
另一种替代方法是将该对象显式传递给 class Tab_1.
的构造函数最后,table_add_item 方法可以变得更具可读性
def table_add_item(self, items):
for i, text in enumerate(items):
self.table.setItem(i, 0, QTableWidgetItem(text))