Python 将pyqt qtablewidget水平标题标签设置为可编辑

Python 将pyqt qtablewidget水平标题标签设置为可编辑,python,pyqt,Python,Pyqt,如何通过双击qtablewidget来编辑水平标题的标签? 到目前为止我所拥有的,但不起作用。因此,当有人双击顶部标题时,会弹出一个linedit,允许输入文本,然后重置标签 import sys from PyQt4 import QtGui,QtCore import generate_file class WebGetMain(QtGui.QMainWindow,generate_file): def __init__(self,parent=None): su

如何通过双击qtablewidget来编辑水平标题的标签? 到目前为止我所拥有的,但不起作用。因此,当有人双击顶部标题时,会弹出一个linedit,允许输入文本,然后重置标签

import sys
from PyQt4 import QtGui,QtCore
import generate_file


class WebGetMain(QtGui.QMainWindow,generate_file):
    def __init__(self,parent=None):
        super(WebGetMain,self).__init__(parent)
        self.setupUi(self)
        #set these values customizable before user populates the table
        self.row_count = 20
        self.col_count = 20
        #setup actual cols,rows
        self.web_get_table.setRowCount(self.row_count)
        self.web_get_table.setColumnCount(self.col_count)
        #allow horizontal header to be altered
        #create and initialize linedit
        self.linedit = QtGui.QLineEdit(parent=self.web_get_table.viewport())
        self.linedit.setAlignment(QtCore.Qt.AlignTop)
        self.linedit.setHidden(True)
        self.linedit.editingFinished.connect(self.doneEditing)
        #connect double click action on header
        self.web_get_table.connect(self.web_get_table.horizontalHeader(),QtCore.SIGNAL('sectionDoubleClicked(int)'),self.on_header_doubleClicked)
        #setup vertical scrollbars for adding rows
        self.vBar = self.web_get_table.verticalScrollBar()
        self._vBar_lastVal = self.vBar.value()

        #initialize cols,rows
        for column in range(0, 2):
            for row in range(0, 3):
                print row, column
                item = QtGui.QTableWidgetItem()
                self.web_get_table.setItem(row, column, item)
        #scrollbar value signal to detect for scrolling
        self.vBar.valueChanged.connect(self.scrollbarChanged)

    def scrollbarChanged(self, val):
        #initialize scrollbar
        bar = self.vBar
        minVal, maxVal = bar.minimum(), bar.maximum()
        avg = (minVal+maxVal)/2
        rowCount = self.web_get_table.rowCount()

        # scrolling down
        if val > self._vBar_lastVal and val >= avg:
            self.web_get_table.insertRow(rowCount)

        # scrolling up
        elif val < self._vBar_lastVal:
            lastRow = rowCount-20
            empty = True
            for col in xrange(self.web_get_table.columnCount()):
                item = self.web_get_table.item(lastRow, col)
                if item and item.text():
                    empty=False
                    break
            if empty:
                #remove rows when scrolling up
                self.web_get_table.removeRow(lastRow)
        self._vBar_lastVal = val

    def doneEditing(self):
        self.linedit.blockSignals(True)
        self.linedit.setHidden(True)
        oldname = self.web_get_table.model().dataset.field(self.sectionedit)
        newname = str(self.linedit.text())
        self.web_get_table.model().dataset.changeFieldName(oldname,newname)
        self.linedit.setText('')
        self.web_get_table.setCurrentIndex(QtCore.QModelIndex())        

    def on_header_doubleClicked(self,item):
        self.linedit.setText(self.web_get_table.model().field(item).name)
        self.linedit.setHidden(False)
        self.linedit.blockSignals(False)
        self.linedit.setFocus()
        self.linedit.selectAll()
        self.sectionedit = item

def main():
    app = QtGui.QApplication(sys.argv)
    app.setStyle(QtGui.QStyleFactory.create("Plastique"))
    main_window = WebGetMain()
    main_window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
导入系统 从PyQt4导入QtGui、QtCore 导入生成文件 类WebGetMain(QtGui.QMainWindow,生成_文件): def uuu init uuu(self,parent=None): 超级(WebGetMain,self)。\uuuu初始化\uuuuu(父级) self.setupUi(self) #在用户填充表之前,设置这些可自定义的值 self.row\u计数=20 self.col\u计数=20 #设置实际列数、行数 self.web\u get\u table.setRowCount(self.row\u count) self.web\u get\u table.setColumnCount(self.col\u count) #允许更改水平收割台 #创建并初始化linedit self.linedit=QtGui.QLineEdit(父项=self.web\u get\u table.viewport()) self.linedit.setAlignment(QtCore.Qt.AlignTop) self.linedit.setHidden(True) self.linedit.editingFinished.connect(self.doneEditing) #连接头上的双击操作 self.web\u get\u table.connect(self.web\u get\u table.horizontalHeader(),QtCore.SIGNAL('sectionDoubleClicked(int')),self.on\u header\u doubleClicked) #设置用于添加行的垂直滚动条 self.vBar=self.web\u get\u table.verticalScrollBar() self.\u vBar\u lastVal=self.vBar.value() #初始化列、行 对于范围(0,2)中的列: 对于范围(0,3)中的行: 打印行、列 item=QtGui.QTableWidgetItem() self.web\u get\u table.setItem(行、列、项) #用于检测滚动的滚动条值信号 self.vBar.valueChanged.connect(self.scrollbarChanged) def scrollbarChanged(自我,val): #初始化滚动条 bar=self.vBar minVal,maxVal=bar.minimum(),bar.maximum() 平均值=(最小值+最大值)/2 rowCount=self.web\u get\u table.rowCount() #向下滚动 如果val>self.\u vBar\u lastVal和val>=平均值: self.web\u get\u table.insertRow(行数) #向上滚动 elif val老实说,我不知道你想用它做什么。但在我看来,你已经成功了一半。使用
section双击
horizontalHeader()
的信号是一个良好的开端。但剩下的对我来说是个大问号

您需要做的就是:使用
horizontalHeaderItem(index)
获取标题项,并使用
text
获取值,或使用
setText
设置新值

您可以考虑从用户那里获取新的值。 下面是一个简单的例子,说明了这一点:

import sys
from PyQt4 import QtGui

class MyWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.table = QtGui.QTableWidget(5,5)
        self.table.setHorizontalHeaderLabels(['1', '2', '3', '4', '5'])
        self.table.setVerticalHeaderLabels(['1', '2', '3', '4', '5'])
        self.table.horizontalHeader().sectionDoubleClicked.connect(self.changeHorizontalHeader)

        layout = QtGui.QHBoxLayout()
        layout.addWidget(self.table)
        self.setLayout(layout)

    def changeHorizontalHeader(self, index):
        oldHeader = self.table.horizontalHeaderItem(index).text()
        newHeader, ok = QtGui.QInputDialog.getText(self,
                                                      'Change header label for column %d' % index,
                                                      'Header:',
                                                       QtGui.QLineEdit.Normal,
                                                       oldHeader)
        if ok:
            self.table.horizontalHeaderItem(index).setText(newHeader)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    main = MyWindow()
    main.show()

    sys.exit(app.exec_())

我从QT中心的mechsin那里找到了这个答案,它对我很有用:

请参阅线程中的最后一条注释。总之,它在表头的视口中创建QLineEdit。双击页眉的窗口将在适当的位置和宽度显示行编辑,以覆盖页眉部分。用于完成行编辑的槽隐藏行编辑并捕获标题项的文本值