[gelöst] ComboBox in einer Liste

Alles zum Qt Framework für Java
Antworten
Eistoeter
Beiträge: 10
Registriert: 5. November 2007 22:53

[gelöst] ComboBox in einer Liste

Beitrag von Eistoeter »

Hallo

Ich habe gerade ein Problem und komme da absolut nicht weiter.

Ich habe eine Liste vom Typ QTreeView, welche in einer Page zum Einsatz kommt vom Typ QWidget. Die Liste wird von einem Model vom Typ QStandardItemModel mit Daten versorgt.

Am Besten ich zeige mal einen Screenshot, damit man sich das vorstellen kann -> ist im Anhang.

Nun möchte ich, dass in der Spalte "Wahlpflichtfach", die in dem Screenshot zu sehen ist, die Daten durch eine ComboBox für den Benutzer editierbar sind. Er soll dort alle Wahlpflichtfächer auswählen können, die in der Datenbank gespeichert sind.

Wie bring ich denn in diese Liste jetzt eine ComboBox in die erste Spalte? Bin völlig ratlos.

Wäre sehr dankbar für jegliche Hilfe.

Hier noch der Code dazu für die QTreeView und das Model (weiß nicht welches von beiden relevant ist für das Problem):

Code: Alles auswählen

package wpfv.ui;

import java.util.List;

import wpfv.dto.Course;
import wpfv.logic.SelectedCoursesModel;

import com.trolltech.qt.core.Qt.SortOrder;
import com.trolltech.qt.gui.*;
import com.trolltech.qt.core.QModelIndex;


public class SelectedCoursesView extends QTreeView {
	
	// Das Model, auf dem das View basiert
	private SelectedCoursesModel model;
	
	
	/**
	 * Erzeugt das SelectedCoursesView.
	 * 
	 * @param model	Das Model, auf dem das View basiert.
	 */
	public SelectedCoursesView(SelectedCoursesModel model) {
		
		super();
		this.model = model;
        setModel(model);
		setRootIsDecorated(false);
        setAlternatingRowColors(true);
        setSortingEnabled(true);
        sortByColumn(0, SortOrder.AscendingOrder);
        
        // Passt die Spalten nach dem Hinzufügen des Datensatzes auf optimale Größe an
		resizeColumnToContents(0);
		resizeColumnToContents(1);
		resizeColumnToContents(2);
		resizeColumnToContents(3);
        
	}
	
	
	/**
	 * Gibt die ausgewählte Wahlpflichtfachbelegung zurück.
	 * 
	 * @return	Das ausgewählte CourseSelection-Objekt.
	 */
	public Course getMarked() {
		
		// Holen des markierten Index und Übergabe des Index an SelectedCoursesModel
		List<QModelIndex> IndexList = selectedIndexes();
		Course markedCourse = model.getMarked(IndexList);
		
		return markedCourse;
		
	}
	
	
	/**
	 * Fügt ein neues Wahlpflichtfach hinzu.
	 * 
	 * @param newCourse	Das hinzuzufügende Wahlpflichtfach als Course-Objekt.
	 * @return			true, falls das Hinzufügen erfolgreich war, sonst false.
	 */
	boolean add(Course newCourse) {
		
		boolean addSuccessful;
		
		// Übergibt neuen Datensatz an Model
		addSuccessful = model.add(newCourse);

		// Passt die Spalten nach dem Hinzufügen des Datensatzes auf optimale Größe an
		resizeColumnToContents(0);
		resizeColumnToContents(1);
		resizeColumnToContents(2);
		resizeColumnToContents(3);
		
		return addSuccessful;

	}

}

Code: Alles auswählen

package wpfv.logic;

import java.util.*;

import wpfv.dto.Course;
import wpfv.dto.Student;
import wpfv.ui.StudentsPage;

import com.trolltech.qt.core.Qt.Orientation;
import com.trolltech.qt.core.Qt.MatchFlags;
import com.trolltech.qt.core.Qt.MatchFlag;
import com.trolltech.qt.core.*;
import com.trolltech.qt.gui.*;


public class SelectedCoursesModel extends QStandardItemModel {
	
	// Enhält immer alle Einträge, welche auch in der Datenbank gespeichert sind.
	// Wird dann zum Abgleich benötigt.
	private LinkedList<Course> dbList;
	
	// Enthält die aktuelle Liste der Wahlpflichtfachbelegungen,
	// also auch mit den aktuellen Änderungen. Muss immer aktuell
	// gehalten werden.
	private LinkedList<Course> actualList;
	
	
	/**
	 * Erzeugt ein Wahlpflichtfachbelegungen-Model.
	 */
	public SelectedCoursesModel() {
		
		// Erzeuge Tabelle
		super(0, 4);
        setHeaderData(0, Orientation.Horizontal, tr("Wahlpflichtfach"));
        setHeaderData(1, Orientation.Horizontal, tr("Dozent"));
        setHeaderData(2, Orientation.Horizontal, tr("Aktuelle Teilnehmer"));
        setHeaderData(3, Orientation.Horizontal, tr("Maximale Teilnehmer"));
        
        // Erzeuge die benötigten Listen
        dbList		= new LinkedList<Course>();
        actualList	= new LinkedList<Course>();
	
        // Erstmaliges Befüllen
        load();
	
	}
	
	
	/**
	 * Befüllen des Models durch komplettes Auslesen der Datenbanktabelle.
	 */
	private void load() {
    	
    	int i = 0; // Zählvariable
    	Student focusedStudent; // Student für den die Wahlpflichtfachbelegung stattfindet
    		
    	
    	// Liest alle Wahlpflichtfachbelegung-Datensätze des gewählten Studenten aus
    	if (Core.loggedInStudent != null) {
    		focusedStudent = Core.loggedInStudent;
    	}
    	else {
    		focusedStudent = StudentsPage.listView.getMarked();
    	}
    	Course[] allSelectedCourses = Core.courseSelectionsDataConnect.readSelectedCourses(focusedStudent);
    	
    	
    	// Liest die Anzahl der Zeilen aus SelectedCoursesModel aus und entfernt alle Einträge
    	removeRows(0, rowCount());
    	
    	// Legt neue Zeile an und fügt Course in neu erstellte Zeile sowie die Liste ein
    	for(Course oneCourse : allSelectedCourses) {
    		
    		insertRow(i);
    		
    		setData(index(i, 0), oneCourse.getName());
    		setData(index(i, 1), oneCourse.getLecturer());
    		setData(index(i, 2), oneCourse.getUpperLimit());
    		setData(index(i, 3), oneCourse.getUpperLimit());
    		
    		// dbList befüllen
    		dbList.add(oneCourse);
    		
    		// Auch in die actualList einfügen für Backtracing der Änderungen
    		actualList.add(oneCourse);    		

    		i++;
    	}
    	
    	// Sortiert das Model nach dessen Befüllung
    	sort(0);
    	
    }

	
	/**
	 * Auslesen des Datensatzes an Stelle 'Index' und Erzeugung eines Wahlpflichtfachbelegung-Objekts.
	 */
	public Course getMarked(List<QModelIndex> IndexList) {
		
		// Nach diesem Namen wird gesucht
		String searchedName = data(IndexList.get(0)).toString();
		
		// Suche den markierten Course in der actualList
		for (int index = 0; index < actualList.size(); index++) {
			
			if (actualList.get(index).getName().equals(searchedName)) {
				return actualList.get(index); // Element gefunden
			}
		}
		
		return null;
		
	}


	/**
	 * Eigenschaften der Felder festlegen.
	 */
	public Qt.ItemFlags flags(QModelIndex index) {
		
		return new Qt.ItemFlags(Qt.ItemFlag.ItemIsSelectable, Qt.ItemFlag.ItemIsEnabled);
		
	}
}

Dateianhänge
Problemstellung des Beitrags
Problemstellung des Beitrags
wpfv.jpg (60.39 KiB) 4486 mal betrachtet
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

mit einem Delegate

in diesem Falle könntest Du QItemDelegate ableiten und folgende Methoden implementieren

Code: Alles auswählen

QWidget createEditor() {
   if (modelindex ... ist Wahlpflichtfach) {
       QComboBox combobox = new QComboBox();
       combobox ... mit verfügbaren Wahlfächern füllen
       return combobox;
   }
   else {
       return null;
   }
}

void setModelData(...) {
   if (modelindex ... ist Wahlpflichtfach) {
       QComboBox combobox = QComboBox) widget;
       ... auswahl aus dem aktuellen combobox eintrag in Dein Model setzen ...
    }
}

void setEditorData(...) {
   if (modelindex ... ist Wahlpflichtfach) {
       QComboBox combobox = QComboBox) widget;
       ... auswahl aus dem model in die combobox übernehmen ...
    }
}
Dafür gibt es auch ein Beispiel in QtJambe ich glaube es heißt StarDelegate. Du musst in deinem Model noch in der Methode flags zusätzlich Qt.ItemFlags.editable (o.ä.) zurückgeben und natürlich für den View

Code: Alles auswählen

MeinView.setItemDelegate(new MyDelegate()); 
aufrufen

Gruß Arne

PS. das war eben frei drauflos geschrieben, also bitte nicht nach Syntaxfehlern suchen ;-)
Eistoeter
Beiträge: 10
Registriert: 5. November 2007 22:53

Beitrag von Eistoeter »

Danke du hast mir sehr geholfen. Ich hab es jetzt hinbekommen. Das ist aber ganz schön viel Aufwand, den man da betreiben muss ^ ^
Antworten