2017-04-21 1 views
0

Ich möchte den Text der horizontalen Header in meinem QTableView mit Benutzer eingegebenen Text in mehreren QLineEdit Widgets festlegen. Ich bin neu in der Model-View-Programmierung und im Qt-Framework, also bin ich mir nicht sicher, ob dies der richtige Weg ist, aber was ich bisher erreicht habe, ist, dass in meiner MainWindow-Klasse das Widget mit den QLineEdits als gesetzt ist das zentrale Widget und dann .text() wird für alle QLineEdits aufgerufen. Das Ergebnis wird an eine Liste übergeben und die Liste der Zeichenfolgen wird als Parameter an meine Modellklasse (QAbstractTableModel) übergeben. Im Modell rufe ich die Funktion headerData() auf, um die Strings in den Spalten der rechten Spalte anzuzeigen. Da die QLineEdits jedoch leer sind, wird zunächst nichts angezeigt. Wenn ich jetzt versuche, den Text in QLineEdit zu ändern, werden die Header nicht aktualisiert und die Header bleiben leer. Welche Signale und Slots soll ich verwenden, um QLineEdit mit meinem Modell zu verbinden? Schätzen Sie jede Hilfe.Wie mache ich Text in QLineEdit Widget machen es als Header in einem QTableView gesetzt?

Antwort

1

Da es keinen Quellcode gibt, gebe ich Ihnen meine Meinung basierend auf meinen bisherigen Erfahrungen. Es gibt zwei Möglichkeiten, Signale und Slots zu implementieren. Eine davon ist, dass Sie mehrere "returnPressed" -Signale für alle lineEdits haben und diese mit einem Slot verbinden können, den wir "retrieve_all_line_edits" nennen können, um den gesamten Text von Ihren LineEdits zu erhalten. Jedes Mal, wenn Sie die Return-Taste drücken, egal in welcher Zeile Sie sich befinden, werden immer alle LineEdits angezeigt. Pseducode hier:

lineEdit1.returnPressed.connect(retrieve_all_line_edits) 
lineEdit2.returnPressed.connect(retrieve_all_line_edits) 
.... 

def retrieve_all_line_edits(self): 
    text1 = lineEdit.text() 
    text2 = lineEdit.text() 
    ... 
    tableHeader = [text1, text2...] 
    table_header_update(tableHeader) 

Die andere ist eine Schaltfläche mit einem „geklickt“ -Signal haben kann, und das gleiche tun retrieving etwas wie die erste.

updateButton.clicked.connect(retrieve_all_line_edits) 

Die retrieve_all_line_edits ist die gleiche wie oben.

Entschuldigung für die Verwendung von Python, um dies zu erklären.

+0

Vielen Dank, so dumm von mir, nicht daran zu denken, ich habe an diesem ganzen Tag gearbeitet, also mind neblig ... auch ich schreibe es in Python so besonders danke für kurze Python Beispiel geben. – user21398

+0

Ich habe ein bisschen nachgedacht und bin auf ein anderes Problem gestoßen. Nun, nachdem ich das getan habe, wie gebe ich diese neuen Werte an mein Modell weiter, damit es in meinem QTableView aktualisiert werden kann? – user21398

0

Da ich gesagt habe, dass ich QTableView noch nicht benutzt habe, kann ich Ihre Frage nicht genau beantworten. Aber ich habe das gegoogelt, und es könnte model.appendRow() oder model.insertRow() oder itemDelegate sein. Wenn es immer noch nicht funktioniert, empfehle ich stattdessen, QTableWidget zu versuchen.

Um Ihr QTableView-Widget zu aktualisieren, unabhängig davon, wie Sie Qt Creator oder Qt Designer verwenden oder Ihre Benutzeroberfläche manuell schreiben, verfügen Sie definitiv über eine Benutzeroberflächenklasse und eine aktualisierende UI-Aktionsklasse. Für Ihre UI-Klasse, so scheint es, könnte wie folgt:

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     self.tableView = QTableView() 

und in Ihrer Aktualisierung UI-Klasse, könnten Sie haben:

class UpdateUI(object): 
    def __init__(self, parent = None): 
     super(UpdateUI, self).__init__() 
     self.ui = Ui_MainWindow() #This from your UI class 
     self.ui.setupUi(self) #Initialize your UI 
     self.signal_connect() #a self-written function that handle signal and slots 

    def signal_connect(self) 
     self.ui.updateButton.clicked.connect(self.update_table_view) 
     #or you could have lineEdits with return pressed signal as what I explained in previous answer. 

    def update_table_view(self): 
     #get all the texts first 
     data = self.retrieve_all_line_edit() 

     #update your table view, you have to fill this bit of code by yourself. I just give you an example here. 
     self.ui.tableView.appendRow(data) 

Sie können Ihre UI-Komponenten durch self.ui alle Aktionen ausführen Dies ist die Instanz Ihrer Benutzeroberflächenklasse.

+0

Das Problem ist, dass ich nicht weiß, welche qt-Funktionen ich verwenden kann, um die Tabellenspalten zu füllen. Wie kann ich diese neue Liste von Zeichenfolgen an mein Modell übergeben, damit es aktualisiert werden kann? – user21398

Verwandte Themen