【问题标题】:PyQt5 Qtablewidget and connecting to buttonsPyQt5 Qtablewidget 和连接按钮
【发布时间】:2019-02-19 15:27:54
【问题描述】:

我创建了一个 Qtablewidget 作为一个类,并创建了一个 add_button 来添加行,一个 delete_button 来从表中向上删除行。我想将功能连接到按钮,但它不能正常工作。我已经使用 getattr 方法调用该函数,但仍然不起作用。

桌子

为了解释更多,这些脚本行给出了属性错误。当它们被 button.clicked.connect 方法调用时。

add_button.clicked.connect(self._addrow)
delete_button.clicked.connect(self._removeItem)

脚本如下:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets, Qt


class loadtable(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        super(loadtable, self).__init__(parent)

        self.setColumnCount(5)
        self.setRowCount(1)
        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))   
        headertitle = ("A","B","C","D","E")
        self.setHorizontalHeaderLabels(headertitle)
        self.verticalHeader().setVisible(False)
        self.horizontalHeader().setHighlightSections(False)
        self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed)
        self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
        self.setColumnWidth(0, 130)
        combox_lay = QtWidgets.QComboBox(self)
        combox_lay.addItems(["I","II"])
        self.setCellWidget(0, 4, combox_lay)


        self.cellChanged.connect(self._cellclicked)
        #self.cellChanged.connect(self._addrow)
        #self.cellDoubleClicked.connect(self._removerow)

    def _cellclicked(self):
        self.value = self.currentItem()
        self.value.setTextAlignment(Qt.AlignCenter)
        #if self.value is not None:
           #return self.value.setTextAlignment(Qt.AlignCenter)        

    def _addrow(self):
        rowcount = self.rowCount()
        print(rowcount)
        self.setRowCount(rowcount+1)
        combox_add = QtWidgets.QComboBox(self)
        combox_add.addItems(["I","II"])
        self.setCellWidget(rowcount, 4, combox_add)

    def _removerow(self):
        self.removeRow(1)


class thirdtabloads(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(thirdtabloads, self).__init__(parent)      
        table = loadtable()


        button_layout = QtWidgets.QVBoxLayout()
        add_button = QtWidgets.QPushButton("Add")
        add_button.clicked.connect(self._addrow)
        delete_button = QtWidgets.QPushButton("Delete")
        delete_button.clicked.connect(self._removeItem)
        button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom)
        button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop)


        tablehbox = QtWidgets.QHBoxLayout()
        tablehbox.setContentsMargins(10,10,10,10)
        tablehbox.addWidget(table)

        grid = QtWidgets.QGridLayout(self)
        grid.addLayout(button_layout, 0, 1)
        grid.addLayout(tablehbox, 0, 0)        



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = thirdtabloads()
    w.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 如果你有n行,当你按下delete_button按钮时,应该删除哪一行?
  • 一个选项是从第一行删除最后一行。第二个选项我想选择一行然后删除它。
  • 请决定,您要删除第一行还是最后一行?
  • 最后一个被删除:)

标签: python pyqt pyqt5 qtablewidget qpushbutton


【解决方案1】:

要添加一行你必须使用insertRow(),要删除最后一行使用removeRow()并传递最后一行,记住编号从0开始所以最后一行是self.rowCount() - 1.

另一方面,你的连接不正确,我问你:谁拥有插槽 _addrow()_removerow() 属于 LoadTable,所以要访问它们,我们需要一个对象类,即table._addrowtable._removerow

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class LoadTable(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        super(LoadTable, self).__init__(1, 5, parent)
        self.setFont(QtGui.QFont("Helvetica", 10, QtGui.QFont.Normal, italic=False))   
        headertitle = ("A","B","C","D","E")
        self.setHorizontalHeaderLabels(headertitle)
        self.verticalHeader().hide()
        self.horizontalHeader().setHighlightSections(False)
        self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed)

        self.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
        self.setColumnWidth(0, 130)

        combox_lay = QtWidgets.QComboBox(self)
        combox_lay.addItems(["I","II"])
        self.setCellWidget(0, 4, combox_lay)

        self.cellChanged.connect(self._cellclicked)

    @QtCore.pyqtSlot(int, int)
    def _cellclicked(self, r, c):
        it = self.item(r, c)
        it.setTextAlignment(QtCore.Qt.AlignCenter)        

    @QtCore.pyqtSlot()
    def _addrow(self):
        rowcount = self.rowCount()
        self.insertRow(rowcount)
        combox_add = QtWidgets.QComboBox(self)
        combox_add.addItems(["I","II"])
        self.setCellWidget(rowcount, 4, combox_add)

    @QtCore.pyqtSlot()
    def _removerow(self):
        if self.rowCount() > 0:
            self.removeRow(self.rowCount()-1)


class ThirdTabLoads(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ThirdTabLoads, self).__init__(parent)    

        table = LoadTable()

        add_button = QtWidgets.QPushButton("Add")
        add_button.clicked.connect(table._addrow)

        delete_button = QtWidgets.QPushButton("Delete")
        delete_button.clicked.connect(table._removerow)

        button_layout = QtWidgets.QVBoxLayout()
        button_layout.addWidget(add_button, alignment=QtCore.Qt.AlignBottom)
        button_layout.addWidget(delete_button, alignment=QtCore.Qt.AlignTop)


        tablehbox = QtWidgets.QHBoxLayout()
        tablehbox.setContentsMargins(10, 10, 10, 10)
        tablehbox.addWidget(table)

        grid = QtWidgets.QGridLayout(self)
        grid.addLayout(button_layout, 0, 1)
        grid.addLayout(tablehbox, 0, 0)        


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = ThirdTabLoads()
    w.show()
    sys.exit(app.exec_())

【讨论】:

  • 太棒了 :) 我有一个关于你的回答的问题,这是什么意思,或者这个 1、5 数字是什么意思? super(LoadTable, self).__init__(1, 5, parent)
  • 我可以看到,我的问题只是缺少@QtCore.pyqtSlot()。那么它将解决问题。但是您以更专业的方式重写。谢谢这是您第三次帮助我。 :)
  • @ZarKha QTableWidget 你有几个构造函数,其中有:doc.qt.io/qt-5/qtablewidget.html#QTableWidget-1,在那个构造函数中你可以指明初始行数和列数,所以1和5等于:self.setColumnCount(5) self.setRowCount(1)
  • @ZarKha 那是一种改进,而不是解决方案,分析差异和我的解释。另一方面,如果我的回答对你有帮助,不要忘记将其标记为正确,这是最好的感谢方式,如果你不知道该怎么做,请查看tour,这是最好的感谢方式。跨度>
  • 非常感谢您的改进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2020-12-05
相关资源
最近更新 更多