Python 如何将多个QpushButton添加到QTableView?
我有一个Python 如何将多个QpushButton添加到QTableView?,python,pyside,Python,Pyside,我有一个QTableView,我想为每一行设置一个QPushButton。我在从QWidget派生的类中执行以下操作,下面是一个示例: 如果表格已绘制,我单击其中一个QPushButton,则调用方法self.button\u edit,但调用哪一个?似乎没有任何类型的“事件”被赋予self.button\u edit,因此如何找到在button\u edit方法中单击的QPushButton的行索引 也许有一种完全不同的方法可以将按钮添加到表的每一行?您的事件处理程序看起来与此类似: def
QTableView
,我想为每一行设置一个QPushButton
。我在从QWidget
派生的类中执行以下操作,下面是一个示例:
如果表格已绘制,我单击其中一个QPushButton
,则调用方法self.button\u edit
,但调用哪一个?似乎没有任何类型的“事件”被赋予self.button\u edit
,因此如何找到在button\u edit
方法中单击的QPushButton
的行索引
也许有一种完全不同的方法可以将按钮添加到表的每一行?您的事件处理程序看起来与此类似:
def handleButtonClicked(self):
button = QtGui.qApp.focusWidget()
# or button = self.sender()
index = self.table.indexAt(button.pos())
if index.isValid():
print(index.row(), index.column())
这使用函数获取按钮的位置
为清楚起见,我的脚本如下所示:
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self,parent)
self.table = QtGui.QTableWidget()
self.table.setColumnCount(3)
self.setCentralWidget(self.table)
data1 = ['row1','row2','row3','row4']
data2 = ['1','2.0','3.00000001','3.9999999']
self.table.setRowCount(4)
for index in range(4):
item1 = QtGui.QTableWidgetItem(data1[index])
self.table.setItem(index,0,item1)
item2 = QtGui.QTableWidgetItem(data2[index])
self.table.setItem(index,1,item2)
self.btn_sell = QtGui.QPushButton('Edit')
self.btn_sell.clicked.connect(self.handleButtonClicked)
self.table.setCellWidget(index,2,self.btn_sell)
def handleButtonClicked(self):
button = QtGui.qApp.focusWidget()
# or button = self.sender()
index = self.table.indexAt(button.pos())
if index.isValid():
print(index.row(), index.column())
这将生成如下的小型GUI:
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self,parent)
self.table = QtGui.QTableWidget()
self.table.setColumnCount(3)
self.setCentralWidget(self.table)
data1 = ['row1','row2','row3','row4']
data2 = ['1','2.0','3.00000001','3.9999999']
self.table.setRowCount(4)
for index in range(4):
item1 = QtGui.QTableWidgetItem(data1[index])
self.table.setItem(index,0,item1)
item2 = QtGui.QTableWidgetItem(data2[index])
self.table.setItem(index,1,item2)
self.btn_sell = QtGui.QPushButton('Edit')
self.btn_sell.clicked.connect(self.handleButtonClicked)
self.table.setCellWidget(index,2,self.btn_sell)
def handleButtonClicked(self):
button = QtGui.qApp.focusWidget()
# or button = self.sender()
index = self.table.indexAt(button.pos())
if index.isValid():
print(index.row(), index.column())
单击编辑
按钮时,它会将以下内容打印到控制台:
(0, 2)
(1, 2)
(2, 2)
(3, 2)
第一个元素是行索引,第二个是列(记住它是基于0的,这就是为什么它显示2,而不是3-尽管列标题不同)。创建自定义按钮
class IndexedButtonWidget(QPushButton):
def __init__(self, parent=None):
super(QPushButton, self).__init__(parent=parent)
self.button_row = 0
self.button_column = 0
然后创建一个按钮对象
self.btn_sell = IndexedButtonWidget('Edit')
self.btn_sell.button_row = row
self.btn_sell.button_column = column
self.btn_sell.clicked.connect(self.handleButtonClicked)
def handleButtonClicked(self):
button = self.sender()
print(button.button_row)
print(button.button_column)
例如:
class IndexedButtonWidget(QPushButton):
def __init__(self, parent=None):
super(QPushButton, self).__init__(parent=parent)
self.button_row = 0
self.button_column = 0
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self,parent)
self.table = QtGui.QTableWidget()
self.table.setColumnCount(3)
self.setCentralWidget(self.table)
data1 = ['row1','row2','row3','row4']
data2 = ['1','2.0','3.00000001','3.9999999']
self.table.setRowCount(4)
for index in range(4):
item1 = QtGui.QTableWidgetItem(data1[index])
self.table.setItem(index,0,item1)
item2 = QtGui.QTableWidgetItem(data2[index])
self.table.setItem(index,1,item2)
self.btn_sell = IndexedButtonWidget('Edit')
self.btn_sell.button_row = index
self.btn_sell.button_column = 2
self.btn_sell.clicked.connect(self.handleButtonClicked)
self.table.setCellWidget(index,2,self.btn_sell)
def handleButtonClicked(self):
button = self.sender()
print(button.button_row)
print(button.button_column)
出于好奇:注释的部分
self.sender()
是否也会起作用?需要注意的是,您在这里使用QTableWidget
而不是QTableView
作为PyQT5的操作,我不得不用QtWidgets
替换QtGui
,但它工作起来很有魅力。谢谢你,安迪