Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多个QpushButton添加到QTableView?_Python_Pyside - Fatal编程技术网

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
,但它工作起来很有魅力。谢谢你,安迪