我最近开始使用 PyQt4 来制作 GUI 应用程序。我试图制作一个使用 QTableWidget 的应用程序。它是 2 列表,其中第一列设置为 QLineEdit,第二列使用委托(delegate)设置为 QListWidget(抱歉,如果“设置为”不是正确的术语”)。QListWidget 列中的条目来自列表输出QFileDialog 的
import sys
from PyQt4.QtGui import *
from PyQt4 import uic
from PyQt4.QtCore import *
qtCreatorFile = "app_name.ui" # UI File designed using QtDesigner
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
class DelegateLEdit(QStyledItemDelegate):
def createEditor(self, parent, option, index):
line_edit = QLineEdit(parent)
return line_edit
class DelegateLWidget(QStyledItemDelegate):
def createEditor(self, parent, option, index):
list_widget = QListWidget(parent)
list_widget.setSelectionMode(QAbstractItemView.ExtendedSelection)
return list_widget
除了一件事之外,一切似乎都运行良好。每当我双击 QListWidget 列中的任何单元格时,该特定单元格的内容都会设置为 -1。我还没有处理“doubleClicked”信号。即使我这样做了(我让它在文本浏览器上打印单元格的内容),双击单元格将内容设置为-1。谁能帮我解决这个问题吗?我尝试阅读 QTableWidget 文档,但没有找到任何成功。有人可以指出我错过了什么吗? 这是我的 Form 类的 init 函数
def __init__(self):
QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setupUi(self)
self.setWindowFlags(Qt.WindowMinimizeButtonHint)
self.list_widget = QListWidget()
self.add_button.clicked.connect(self.add_to_list)
# self.table.itemDoubleClicked.connect(self.print_cell_content)
self.table.setColumnCount(2)
first_header = "Option"
second_header = "Directories"
header = first_header + ";" + second_header
self.table.setHorizontalHeaderLabels(header.split(";"))
header = self.table.horizontalHeader()
header.setResizeMode(1, QHeaderView.ResizeToContents)
self.table.resizeColumnsToContents()
# self.table.setShowGrid(False)
self.delegate_lw = DelegateLWidget(self)
self.delegate_le = DelegateLEdit(self)
self.table.setItemDelegateForColumn(0, self.delegate_le)
self.table.setItemDelegateForColumn(1, self.delegate_lw)
编辑: 添加按钮的处理程序,将文件添加到表的第二列
def add_to_list(self):
file_dialog = QFileDialog(self)
file_dialog.saveState()
file_dialog.setOption(QFileDialog.DontUseNativeDialog, True)
file_list = file_dialog.getOpenFileNames()
self.dir_list.extend(file_list)
self.dir_list = list(set(self.dir_list))
self.add_items(self.dir_list)
def add_items(self, list_items):
list_items.sort()
column = 1
self.row_count = 0
for item in list_items:
self.table.insertRow(self.row_count)
self.table.setItem(self.row_count, column, QTableWidgetItem(item))
self.row_count += 1
谢谢
最佳答案
您需要实现 setEditorData和 setModelData在您的委托(delegate)中,以便能够存储和检索模型的数据。对于列表小部件列,默认行为是显示当前索引,对于空列表,该索引将为 -1
。
您的委托(delegate)类应如下所示:
class DelegateLEdit(QStyledItemDelegate):
def createEditor(self, parent, option, index):
line_edit = QLineEdit(parent)
return line_edit
def setEditorData(self, editor, index):
editor.setText(index.data())
def setModelData(self, editor, model, index):
model.setData(index, editor.text())
class DelegateLWidget(QStyledItemDelegate):
def createEditor(self, parent, option, index):
list_widget = QListWidget(parent)
list_widget.setSelectionMode(QAbstractItemView.ExtendedSelection)
list_widget.addItems('One Two Three Four'.split()) # or whatever
return list_widget
def setEditorData(self, editor, index):
for line in index.data().splitlines():
for item in editor.findItems(line, Qt.MatchExactly):
item.setSelected(True)
def setModelData(self, editor, model, index):
text = '\n'.join(item.text() for item in editor.selectedItems())
model.setData(index, text)
关于python - 双击 PyQt4 QTableWidget 上的行将内容设置为 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661324/