Python 将pyqt qtablewidget水平标题标签设置为可编辑
如何通过双击qtablewidget来编辑水平标题的标签? 到目前为止我所拥有的,但不起作用。因此,当有人双击顶部标题时,会弹出一个linedit,允许输入文本,然后重置标签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
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 valsection双击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。双击页眉的窗口将在适当的位置和宽度显示行编辑,以覆盖页眉部分。用于完成行编辑的槽隐藏行编辑并捕获标题项的文本值