2017-10-10 8 views
1

Ich habe vor kurzem begonnen, PyQt4 für die Erstellung von GUI-Anwendungen zu verwenden. Ich habe versucht, eine Anwendung zu erstellen, in der ich das QTableWidget verwendet habe. Es ist eine zweispaltige Tabelle, in der die erste Spalte auf QLineEdit gesetzt wurde und die zweite Spalte mit Delegaten auf QListWidget gesetzt wurde (Entschuldigung, wenn "set to" nicht die korrekte Terminologie ist.) Die Einträge in der QListWidget-Spalte stammen aus der Listenausgabe eines QFileDialogDoppelklick auf Zeile auf PyQt4 QTableWidget setzt den Inhalt auf -1

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 

Alles gut zu funktionieren mit einer Ausnahme scheint. Jedes Mal, wenn ich auf eine beliebige Zelle in der Spalte klicken QListWidget verdoppeln, werden die Inhalte dieser bestimmten Zelle auf -1. ich habe die "nicht behandelt doubleClicked "Signal. Selbst wenn ich es getan habe (ich habe es den Inhalt der Zelle auf einem TextBrowser drucken), Doppelklick auf die Zelle setzen Sie den Inhalt auf -1. Kann mir bitte jemand dabei helfen? Ich habe versucht, lesen Sie die QTableWidget Dokumentation aber Ich fand keinen Erfolg. Kann jemand bitte darauf hinweisen, was ich vermisse?Hierist die init Funktion meiner Form-Klasse

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) 

EDIT: Handler für Schaltfläche Hinzufügen, die Dateien in der zweiten Spalte der Tabelle

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 

Sie fügt Vielen

+0

Sie konnten zeigen, wie Elemente in die Tabelle hinzuzufügen – eyllanesc

+0

Sie scheinen die Artikel-Delegierten werden mit einem benutzerdefinierten Editor zu schaffen, die nur sichtbar ist, beim Bearbeiten. Willst du das wirklich? Oder möchten Sie eigentlich ein Objekt-Widget einstellen, das jederzeit sichtbar ist? Was erwarten Sie, wenn Sie in eine Zelle doppelklicken? – ekhumoro

+0

@ekhumoro yeah, ich möchte eigentlich, dass das Widget beim Bearbeiten sichtbar ist. Das Problem liegt in der zweiten Spalte, in der ich den Element-Delegaten für das Listen-Widget verwende. Wenn ich auf eine Zelle in dieser Spalte doppelklicke, wird der Wert dieser Zelle auf -1 zurückgesetzt. Ich hoffe, dies zu vermeiden – 0Nicholas

Antwort

1

Sie benötigen Implementieren Sie setEditorData und setModelData in Ihrem Delegaten, um die Daten des Modells speichern und abrufen zu können. In der Listenwidget-Spalte wird standardmäßig der aktuelle Index angezeigt, der -1 für eine leere Liste ist. Hier

ist, was Ihre Stellvertretung Klassen aussehen sollte:

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) 
+0

Vielen Dank dafür. Das hat einen großen Teil meines Problems gelöst. Ich habe den Code leicht modifiziert, um mich an meine Bedürfnisse anzupassen, aber ich stehe jetzt vor einem anderen Problem. Wenn ich auf das Element im list_widget doppelklicke, verschwindet es und erscheint wieder, wenn ich auf ein anderes Objekt klicke. Soll das passieren? Die einzige Änderung, die ich gemacht habe, sind: Die 'list_widget.addItems()' wurde entfernt, wie es in der Form-Klasse und geänderte Zeile zu 'line = index.data()' gemacht wurde. In jedem Fall gibt editor.findItems() eine Liste von len 0 – 0Nicholas

+0

@ 0 Nicholas. Wenn Sie 'addItems' entfernt haben, wie füllt man die Liste auf? Möchten Sie nur ** einen ** Eintrag aus der Liste auswählen? Wenn dies der Fall ist, wäre eine Combo-Box eine viel bessere Wahl für das Editor-Widget. – ekhumoro

+0

Ich habe einen QPushButton hinzugefügt, der mit 'add_to_list()' Methode verbunden ist. Ich habe die Frage bearbeitet und den Code für das gleiche hinzugefügt. Ist das eine schlechte Art das Listen-Widget zu füllen? – 0Nicholas