python - 双击 PyQt4 QTableWidget 上的行将内容设置为 -1

标签 python python-3.x pyqt pyqt4 qtablewidget

我最近开始使用 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

谢谢

最佳答案

您需要实现 setEditorDatasetModelData在您的委托(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/

相关文章:

python - 数据存储以简化 Python 中的数据插值

python - 尝试循环 DataFrame 中的列并剥离美元符号

python - 使用 jupyter notebook 运行选定的行并显示输出

python - 按任意间隔对时间索引的 DataFrame 进行分组

python - 使用条件语句在 Python 列表中搜索元素

python - 在 PyQt 中清除一个 TableView

python - 全屏鼠标释放事件

python - 如何替换 "from IPython.kernel import KernelManager"?

python - 选择 Bokeh 图中的文本

linux - 执行已知已安装的可执行文件时遇到问题